2009-02-09 3 views
0

У меня есть база данных с информацией о событиях, включая дату (в формате MMDDYYYY). можно ли написать оператор SQL Server только для получения строк, которые попадают в определенный временной интервал?Как сделать условные заявления SQL Server?

что-то вроде этого псевдо-заявление:

SELECT * FROM events WHERE [current_date minus date <= 31] ORDER BY date ASC 

где date дата в строке SQL Server и current_date сегодняшняя дата. 31 - это дни, поэтому в основном месяц.

Я могу легко обработать данные после обобщенного заявления (читай: SELECT * FROM events ORDER BY date ASC), но было бы «круто» (как во мне узнать что-то новое: P), чтобы узнать, возможно ли это.

ответ

4

SELECT * FROM события WHERE date> getdate() - 31 ORDER BY date ASC

+0

Я получаю ошибку арифметического переполнения при преобразовании столбца даты (строки, в формате mmddyyyy) в метку времени. есть ли функция, которую я могу назвать, например, CType (date, datetime)? – Anders

+0

Попробуйте: convert (datetime, substring (date, 5, 4) + '-' + substring (date, 1, 2) + '-' + substring (date, 3, 2)) –

0

DateDiff и GetDate() должны отсортировать вас.

Пример:

SELECT * FROM events WHERE DATEDIFF(day, date, GETDATE()) <= 31 ORDER BY date ASC 
+0

не будет выполнять, так как вы используете функции WHERE дата> getdate() - 31 намного лучше – SQLMenace

+0

Избегайте getdate() в тех случаях, когда это возможно, поскольку это приводит к неопределенному запросу. – geofftnz

2

Применение DateDiff:

SELECT * FROM событий, где DATEDIFF (день, дата, GETDATE()) < 31 Сортировать по дате ASC

http://msdn.microsoft.com/en-us/library/ms189794.aspx

+0

не будет работать хорошо, так как вы используете функции WHERE date> getdate() - 31 намного лучше – SQLMenace

0

Возможно, вы можете использовать функцию DATEDIFF.

D'oh, Ninja'd, глядя на него, чтобы убедиться, что я не говорю глупости! :)

0

также:

SELECT * 
FROM events 
WHERE current_date BETWEEN dateadd(day,-31,getdate()) AND getdate() 
ORDER BY date ASC

Хотя на самом деле МЕЖДУ Мерзость

0

Используйте GetDate(), чтобы вернуть текущую дату.

Добавить или вычесть в днях.

Примером может быть:

SELECT * 
FROM MY_TABLE T 
WHERE T.SOME_DATE BETWEEN (GetDate()-31) AND GetDate() 
2
DECLARE @start_date datetime 
SET @start_date = DATEADD(day, -31, getdate()) 
SELECT * FROM events WHERE date BETWEEN @start_date AND getdate() 
1

Для лучшей производительности, не используйте функцию в выражении. Во-первых вычислить дату порог (в вашем клиенте или хранимую процедуру), а затем использовать

SELECT ... WHERE [дата]> {ставить порог здесь}

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