округление датировки - PullRequest
       1

округление датировки

9 голосов
/ 27 февраля 2011

У меня есть таблица БД в 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 (), но это не лучше.

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

спасибо

Ответы [ 4 ]

12 голосов
/ 27 февраля 2011

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
2 голосов
/ 27 февраля 2011
select datediff(d,'30 Dec 2010',getdate()) as days,
datediff(d,'30 Dec 2010',getdate())/7 as weeks

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

0 голосов
/ 15 февраля 2019

Возможно, вы собираетесь скопировать / вставить код в раунд DATEDIFF.

НО ЖДИТЕ МИНУТУ !!!

Если вам нужно что-то вроде этого:

IF DATEDIFF(MONTH, @dateInPast, @today) > @monthes

Я бы предложил использовать что-то вроде этого:

IF @today > DATEADD(MONTH, @monthes, @dateInPast)
0 голосов
/ 27 февраля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...