функция datediff округления

у меня есть таблица БД в SQL Server, которая содержит дату начала проекта.

на веб-странице состояния я хочу показать, сколько дней / недель / месяцев проект запущен, единицы в зависимости от продолжительности. Так что до 21 дня я показывал дни, до 7 недель я показывал недели, в противном случае показывал завершенные месяцы. Поэтому я получаю значения дней, недель и месяцев, а затем могу использовать некоторый код, чтобы решить, какой из них отображать.

предположим, что проект начинается 30 декабря 2010 года, и я проверяю сегодня (27 февраля 2011).

select datediff(d,'30 Dec 2010',getdate()) as days, 
datediff(wk,'30 Dec 2010',getdate()) as weeks , 
datediff(m,'30 Dec 2010',getdate())as months

производит

days: 59    weeks: 9    months: 2

но на самом деле разница составляет 8 целых недель, и происходит некоторое округление.

Я попытался сделать это и в ASP, получив дату начала, а затем выполнив datediff (), но это не лучше.

есть ли лучший способ?

спасибо

3 ответов


DATEDIFF использует границу части даты. Так что для" дня " 23: 59 сегодня-это целый день до 00: 01 завтра.

эти вычисления вида лучше всего делать с использованием той же единицы.

;WITH cDayDiff AS
(
   select datediff(day,'20101230',getdate()) as days
)
SELECT
   days / 7 as weeks, --integer division
   days % 7 as remainingdays
FROM
   cDayDiff

месяцы сложнее, потому что каждый месяц меняется. Но вы можете сравнить номера дней (в месяц), чтобы исправить значение.

SELECT
  datediff(month, '20101230', getdate()) -
     CASE WHEN DATEPART(day, '20101230') > DATEPART(day, getdate()) THEN 1 ELSE 0 END 
 as months

select datediff(d,'30 Dec 2010',getdate()) as days,
datediff(d,'30 Dec 2010',getdate())/7 as weeks

Это дает вам 8 недель. Можно разделить на 7.0, чтобы получить десятичные. В этом случае вы получаете 8.428571


Если вы хотите фактическое календарное исчисление дней, недель и месяцев, я думаю, что ваш лучший выбор-использовать NodaTime на пользовательская функция CLR SQL Server.

NodaTime-это порт .NET библиотеки Java JodaTime. JodaTime очень всеобъемлющий; он поддерживает восемь различных календарных систем, и даже будет учитывать високосные годы.

вот краткое введение в JodaTime:
http://technology.amis.nl/blog/5604/introducing-joda-time-the-smart-date-api