Запрос по дате / времени в SQL Server 2005 - PullRequest
3 голосов
/ 30 сентября 2010

У меня такой простой вопрос, я чувствую себя глупо, задавая его.Я не могу поверить, что я бьюсь об этом.

У меня есть таблица под названием "Заказы"«Orders» имеет поле smalldatetime, которое называется «DateOrdered».Мне нужно получить все «Заказы» на конкретную дату.Я безуспешно пробовал следующее:

SELECT * FROM Orders WHERE [DateOrdered]=2010-06-01

SELECT * FROM Orders WHERE [DateOrdered]='2010-06-01'

SELECT * FROM Orders WHERE [DateOrdered]=CAST('2010-06-01' AS smalldatetime)

Что я делаю не так?Я не могу поверить, что даже задаю этот вопрос.

Ответы [ 4 ]

3 голосов
/ 30 сентября 2010

Первый запрос сравнивает дату с числом 2003 (2010 минус 6 минус 1), которое конвертируется в дату '1905-06-27'. Второй и третий запросы будут работать для точных значений даты (т. Е. С компонентом времени 00:00) и эквивалентны.

Есть ли у вас компонент времени в ваших значениях smalldatetime? В этом случае вы можете получить значения в интервале:

SELECT * FROM Orders WHERE DateOrdered >= '2010-06-01' 
                       and DateOrdered < '2010-06-02'

Обратите внимание на использование >= и < вместо ключевого слова between, чтобы исключить любые записи, которые могут иметь точное значение 2010-06-02.

2 голосов
/ 30 сентября 2010

Также обратите внимание на безопасный формат даты ISO (ГГГГММДД), который не взорвется, например, если вы находитесь в Великобритании

SELECT * FROM Orders WHERE [DateOrdered] >='20100601'
AND [DateOrdered] < '20100602'

Этот способ также позволит вам использовать индекс, если вы приведете столбец DateOrdered, индекс не будет использоваться

Вот пример того, что происходит, когда вы используете YYYY-MM-DD вместо YYYYMMDD

SET LANGUAGE 'us_english'

SELECT CONVERT(DATETIME, '2006-04-06'),  --will be YMD
       CONVERT(DATETIME, '20060406')  --safe format

SET LANGUAGE 'Italian'

SELECT CONVERT(DATETIME, '2006-04-06'),  --will be YDM
       CONVERT(DATETIME, '20060406')  -- safe format
1 голос
/ 01 октября 2010

Я предлагаю вам использовать DATEDIFF

SELECT * FROM Orders WHERE DATEDIFF(d, [DateOrdered], '20100601') = 0
1 голос
/ 30 сентября 2010

Я всегда использую этот пост, чтобы вспомнить, как округлить DATETIME в «DATE» для SQL2005 и более ранних версий: Лучший подход для удаления части времени datetime в SQL Server

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...