2016-01-21 2 views
0

Я ищу, чтобы получить текущую дату из даты и времени. Я понимаю, что лучший способ сделать это с помощьюSQL получить тот же день с прошлого года

DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) 

однако если я пытаюсь получить эквивалентный день с прошлого года, я лучше делать

Решение 1

DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), -365) 

ИЛИ Решение 2

DATEADD(YEAR, -1, DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)) 

Есть ли случаи, когда решение 1 не работает?

+0

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

+0

Чтобы расширить свой предыдущий комментарий, вы можете определить, что означает «работает». Я не думаю, что это будет ошибка, но какой ответ правильный, зависит от требований. –

+0

Я думаю, что вы, возможно, ударили ноготь по голове! – Henry

ответ

3

Решение 2 автоматически вычитает 366 дней для високосных годов.

Решение 1 не предусмотрено; вы можете получить следующий день, если речь идет о високосном году.

0

Лучший способ получить текущую дату из datetime, так как SQL Server 2008, является:

CAST(GETDATE() as DATE) 

Лучший способ вычитать в год, чтобы использовать либо YEAR или MONTH:

DATEADD(MONTH, -12, CAST(GETDATE() as DATE)) 
DATEADD(YEAR, -1, CAST(GETDATE() as DATE)) 

Не все дни имеют 365 дней, поэтому это будет неправильный расчет.

+0

Что произойдет, если вы тогда сравниваете это с datetime? не отбросить ли он его обратно? Будет ли это иметь проблемы с производительностью/прибыль? – Henry

+0

@Henry. , , 'date' и' datetime' могут сравниваться друг с другом (дата преобразуется в 'datetime'). На самом деле это не влияет на производительность. Фактически, 'cast (... as date)' даже поддается продвижению - возможно, единственная «функция», которая есть. –

Смежные вопросы