функция 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