2012-05-17 2 views
1

Я пытаюсь захватить количество дней, оставшихся до истечения срока действия учетной записи, поэтому я могу отправить своему пользователю сообщение с уведомлением об этом. У меня есть правильное выражение «Where», но я не уверен, как выбрать разницу как целое число. До сих пор у меня есть:Расчет дней между заданной датой и current_timestamp

SELECT (DATE_EXPIRE-CURRENT_TIMESTAMP),EMAIL 
FROM [myTable] 
WHERE (DATE_EXPIRE - CURRENT_TIMESTAMP <= 10) AND (DATE_EXPIRE - CURRENT_TIMESTAMP >= 1) 

ответ

3
SELECT DATEDIFF(DAY, CURRENT_TIMESTAMP, DATE_EXPIRE),EMAIL 
FROM dbo.[myTable] 
WHERE DATEDIFF(DAY, CURRENT_TIMESTAMP, DATE_EXPIRE) BETWEEN 1 AND 10; 

Один из немногих случаев, когда я на самом деле выступают за помощью BETWEEN. Хотя я по-прежнему предпочитают использовать четкие границы:

DECLARE @tomorrow DATE = DATEADD(DAY, 1, CURRENT_TIMESTAMP); 

SELECT DATEDIFF(DAY, CURRENT_TIMESTAMP, DATE_EXPIRE),EMAIL 
FROM dbo.[myTable] 
WHERE DATE_EXPIRE >= @tomorrow 
AND DATE_EXPIRE < DATEADD(DAY, 10, @tomorrow); 

Вы не должны использовать сокращенную математику (например, datetime - integer), потому что, в то время как это работает с DATETIME/SMALLDATETIME, он ломает, если изменить тип данных DATE, datetime2 и т.д.

За много моих бессвязной по запросам диапазон дат:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

+1

@JonathanDavis не пик, лучший ответ может прийти. –