Как запросить все даты, превышающие определенную дату в SQL Server?


338

Я стараюсь:

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= 2010-04-01;

A.Date выглядит как: 2010-03-04 00:00:00.000

Однако это не работает.

Кто-нибудь может дать ссылку, почему?


17
поместите одинарные кавычки вокруг него
Кевин ДиТраглия

2
В дополнение к кавычкам я рекомендую всегда использовать безопасный и однозначный формат строковых литералов только для даты. Единственный, кому я доверяю, это ГГГГММДД. Смотрите мой комментарий к ответу Дэвида по причине ...
Аарон Бертран

Ответы:


486
select *  
from dbo.March2010 A 
where A.Date >= Convert(datetime, '2010-04-01' )

В вашем запросе 2010-4-01рассматривается как математическое выражение, поэтому по сути это читается

select *  
from dbo.March2010 A 
where A.Date >= 2005; 

( 2010 minus 4 minus 1 is 2005 Преобразование в правильное datetimeи использование одинарных кавычек исправит эту проблему.)

Технически, парсер может позволить вам сойти с рук

select *  
from dbo.March2010 A 
where A.Date >= '2010-04-01'

он сделает преобразование за вас, но, по моему мнению, оно менее читабельно, чем явное преобразование в a DateTimeдля программиста по обслуживанию, который придет за вами.


37
Явное преобразование не обязательно. Также я настоятельно рекомендую использовать ГГГГММДД вместо ГГГГ-ММ-ДД. Зачем? Ну, попробуйте свой код с SET LANGUAGE FRENCH. :-) На эту дату вы получите 4 января, а не 1 апреля. В другие дни вы можете получить ошибку.
Аарон Бертран

4
@ Аарон Бертран - Мой ответ на самом деле заключался в том, что преобразование не нужно, начиная с «Технически, pareser может позволить вам избежать« финального примера кода ». Я просто нахожу его более читабельным, потому что поразительно очевидно, что это дата-время. Слишком много систем баз данных хранят значения даты в поле varchar, но вы правы насчет формата. Обычно при использовании преобразования я также добавляю в спецификатор формата, но я делал свой пример поверх моей руководитель
Дэвид

1
@AaronBertrand, я должен был использовать ваше предложение в сочетании с ответом выше: CONVERT(datetime, '20100401 10:01:01')- передача 2010-04-01 работает в SQL Server Management Studio, но не при отправке оператора SQL через PHP / MSSQL.
скрепка

Я думаю, что достаточно ясно, что это дата, и, следовательно, преобразование не является необходимым.
Жак Матье

56

Попробуйте заключить дату в символьную строку.

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';

2
Добавление времени даст точный результат: где A.Date> = 2014-01-12 12:28:00
shaijut

16

Мы можем использовать как ниже, а также

SELECT * 
FROM dbo.March2010 A
WHERE CAST(A.Date AS Date) >= '2017-03-22';

SELECT * 
    FROM dbo.March2010 A
    WHERE CAST(A.Date AS Datetime) >= '2017-03-22 06:49:53.840';

2
Изменение столбца предиката фильтра не очень хорошая идея. Это предотвращает использование индекса почти полностью.
pimbrouwers

3
DateTime start1 = DateTime.Parse(txtDate.Text);

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= start1;

Сначала конвертируйте TexBox в Datetime, затем .... используйте эту переменную в Query


3

Подводя итог, правильный ответ:

select * from db where Date >= '20100401'  (Format of date yyyymmdd)

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.