TSQl: выберите текущую дату - 6 дней и установите время 0:01 - PullRequest
2 голосов
/ 02 марта 2012

Я пытаюсь получить текущую дату - 6 дней. Это легко.

Сейчас я пытаюсь получить текущую дату - 6 дней + 00:01.

Так что, если сегодня 3-2-2012 11:14 утра.

Я хочу получить 2-25-2012 0:01 утра

Эти 2 выбора дадут мне текущую дату - 6, но не сбросят время на 0:01

  • выберите getdate () - 6
  • SELECT DATEADD (день, -6, CURRENT_TIMESTAMP);

Ответы [ 4 ]

6 голосов
/ 02 марта 2012
SELECT DATEADD(minute, 1, DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - 6, 0))

эквивалентно

SELECT DATEADD(minute, 1, DATEADD(DAY, DATEDIFF(DAY, '19000101', GETDATE()) - 6, '19000101'))

Я думаю, вы найдете эту опцию быстрее и более гибкой, чем реализации varchar. сохраняя типы данных такими, какие они есть, вам не нужно беспокоиться о капризах результатов преобразования / преобразования.

См. Луи Дэвидсон для одного из полных объяснений: http://sqlblog.com/blogs/louis_davidson/archive/2011/02/09/some-date-math-fun.aspx

5 голосов
/ 02 марта 2012

Используя следующее, вы получите результат в формате datetime:

SELECT CAST(Convert(varchar(10), DateAdd(d, -6, getdate()), 101) 
        + ' 12:01 AM' as datetime)

Результат: 2012-02-25 00:01:00.000

Если у вас есть желаемое время и дата, вы можете преобразоватьво многих различных форматах.

Или вы можете сделать следующее в формате varchar:

select Convert(varchar(10), DateAdd(d, -6, getdate()), 110) + ' 12:01 AM'

, что приведет к 02-25-2012 12:01 AM

3 голосов
/ 02 марта 2012

На одно преобразование меньше, чем в решении @Phil Helmer:

SELECT DATEADD(DAY, DATEDIFF(DAY, '19000101', GETDATE()), '1899-12-26T12:01:00')

Поскольку некоторые люди, очевидно, не знают, что все «справа» от элемента, указанного в этой паре DATEADD / DATEDIFF, эффективно берется из правой константы. Все, что «слева» (включая фактический элемент), может быть использовано для достижения эффекта смещения.

(В левом / правом верхнем углу предполагается, что все значение даты и времени интерпретируется с указанием года слева и миллисекундами справа, со всеми промежуточными значениями в порядке «размера»)


Отредактировано - я также обновил свой ответ, чтобы включить -6 в правое значение. Можно создать все виды смещения, выбрав подходящие значения для двух констант.


Взаимосвязь между двумя константами даты и времени, указанными в выражении, должна быть выражена, по крайней мере, в комментарии наряду с использованием. Выше я использую 1/1/1900 в качестве базовой точки и вычисляю количество полуночных переходов между тогда и сейчас (так как DATEDIFF всегда работает). Затем я добавляю это количество дней к моменту времени 6 днями ранее (например, 26.12.1999) ровно в 00:01 утра ...

0 голосов
/ 02 марта 2012
SELECT DATEADD(dd, -6, DATEDIFF(dd, 0, GETDATE())) + '12:01'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...