SQL: как отображать записи только за 30 дней - PullRequest
3 голосов
/ 02 марта 2009

Я пытался использовать

SELECT * from Results
WHERE DATEDIFF(d,Date,getdate())<30

Но, похоже, с этим связана ошибка.

Для каждой представленной записи будет отображаться только 30 дней. Могу ли я узнать, правильный ли мой синтаксис?

высоко ценится, Stan

Ответы [ 6 ]

13 голосов
/ 02 марта 2009

Синтаксис выглядит нормально, но вам может потребоваться «цитировать» Date:

SELECT * from Results WHERE DATEDIFF(d, [Date], getdate()) < 30

У вас есть столбец с именем Дата в результатах?

Кстати, это не сможет использовать индекс, тогда как это будет:

SELECT * from Results WHERE [Date] >= DATEADD(d, -30, getdate()) 
5 голосов
/ 03 марта 2009

Во-первых, вы (и большинство ответов в этой теме) путаете варианты SQL. Вы ничего не сказали в своем вопросе о SQL Server, но получаете рекомендации по использованию синтаксиса SQL Server (т. Е. GetDate ()).

Ответ от JohnFx предоставляет вам правильный синтаксис Jet SQL:

SELECT *  
FROM results 
WHERE ([Date] between DateAdd("d", -30, Date()) and Date())

Но он также прав, если назвать поле «Дата» действительно неправильно в Access / Jet. Предложение WHERE может быть улучшено с помощью:

WHERE (results.Date between DateAdd("d", -30, Date()) and Date())

но я не могу сказать наверняка - я бы никогда не назвал поле "Дата", поэтому никогда бы не столкнулся с такой проблемой.

Но может быть и более простая версия, учитывая, что Jet хранит свои даты в формате, где целая часть указывает дату, а десятичная часть - время. Из-за этого при работе с датами (в отличие от недель, месяцев или кварталов) вы можете напрямую выполнять математику с датами:

WHERE results.Date BETWEEN results.Date-30 AND Date()

Это даст вам те же результаты, что и в версии DateFiff () JohnFx, но для каждой строки не нужно будет вызывать функцию DateAdd.

Ключевым моментом является использование правильного синтаксиса для базы данных Jet, и это означает, что первым аргументом для DateAdd () является строковое значение ("d") и что вы не можете использовать функцию SQL Server (GetDate ( )), но вместо этого должен использовать функцию Jet для той же цели (Date ()). Но также стоит избегать использования функций Jet / Access в вашем SQL, когда это не нужно, и поэтому я считаю, что версия «results.Date-30» будет лучше, чем версия DateAdd (). .

В сторону: я действительно хотел бы, чтобы те, кто публикует ответы с использованием SQL, обращали пристальное внимание на то, какой механизм базы данных использует тот, кто задает вопросы, для выполнения SQL. В этой ветке найдено много неправильных ответов именно потому, что эти постеры не читали вопрос внимательно (из ключевых слов было довольно ясно, какой механизм базы данных был задействован).

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

Попробуйте это:

SELECT *  
FROM results 
WHERE ([Date] between DateAdd("d", -30, Date()) and Date())

Еще один хедз-ап. Называть поле «Дата» в Access, как правило, плохая идея. Это зарезервированное слово, и вам придется использовать скобки [] вокруг него во всех ваших запросах.

2 голосов
/ 02 марта 2009

Если вы используете базу данных Microsoft Access, функция для получения текущей даты: Дата () вместо getdate() (это для SQL Server).

0 голосов
/ 03 марта 2009

Вы не указали SQL Server в качестве своей базы данных. В Access синтаксис для DateAdd: DateAdd ("d", 1, "31-Jan-95").

0 голосов
/ 02 марта 2009

Ваш запрос выглядит звучащим. С какой ошибкой вы сталкиваетесь?

...