Idealmente, você precisará de dois campos de qualquer forma:
- Armazenar duas datas/horas separadamente --OU--
- Armazenar uma data/hora e armazenar o tempo decorrido
Analisando seus requisitos, eu escolheria dois campos de data/hora separados; e calcular os dias completos/meios dias incluindo (somando/subtraindo) feriados.
Mantenha uma tabela de configuração separada para definir/configurar a duração máxima/mínima do dia.
Faça todos os cálculos no dia/hora, dentro da consulta, ou alternativamente na interface do usuário, mediante ações do usuário - se desejar.