Estou usando o SQL SERVER. Eu quero calcular a diferença de data exata no mês sábio. Eu sei que há uma função embutida DATEDIFF
para isso, mas eu quero alguma diferença fracionária personalizada como:
sDate(yyyy-MM-dd) eDate output formula
---------------------------------------------------------------------------------------------------------------
2016-03-03 2016-03-05 0.0967741 3.00/31.00 (daycount/lastday of the month)
2016-03-05 2016-06-05 3.0376343 (27.00/31.00)+(30.00/30.00)+(31.00/31.00)+(5.00/30.00)
2016-02-26 2016-04-03 1.2379310 (4.00/29.00)+(31.00/31.00)+(3.00/30.00)
Então, como isso será calculado? Posso aplicar essa lógica usando uma função, mas não quero fazer isso. Como posso aplicar essa lógica em uma única consulta?
Sua valiosa sugestão será muito apreciada.
Com a ajuda de uma mini mesa de calendário, isso pode ser feito com bastante facilidade:
configuração do rextester: http://rextester.com/ZHTTZ86931
Dados de teste:
Criando uma mini tabela de calendário para rastrear cada data e sua porcentagem de seu mês.
Versão alternativa se você realmente não quiser criar a tabela auxiliar, basta usar o cte recursivo:
Em seguida, a consulta apenas une o calendário em que a data do calendário está entre as datas de início e término e soma a
DayPercentOfMonth
coluna.nota: Os valores de dados de amostra para saída não eram tão precisamente corretos quanto poderiam parecer.
Como você já conhece a fórmula que deseja aplicar para diferenças de data específicas, por que você não usa expressões CASE simples e aplica suas fórmulas específicas.
Finalmente encontrei a solução para minha dúvida e postei aqui. Eu queria usar a solução em uma consulta, então abaixo está a solução:
Primeiro, estou calculando o número de meses excluindo o mês inicial e o mês final de duas datas dadas. Em seguida, o número do mês em fracionário da data de início e o mesmo da data de término.