Як зробити запит на всі дати, що перевищують певну дату в 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
Окрім цитат, я рекомендую завжди використовувати безпечний та однозначний формат для рядкових літералів, що мають лише дату. Єдиному, якому я довіряю, є YYYYMMDD. Дивіться мій коментар до відповіді Девіда з причини, чому ...
Аарон Бертран

Відповіді:


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'

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


37
Явне перетворення не потрібно. Також настійно рекомендую використовувати YYYYMMDD замість YYYY-MM-DD. Чому? Ну, спробуйте свій код SET LANGUAGE FRENCH. :-) На цю дату ви отримаєте 4 січня замість 1 квітня. Для інших дат ви можете отримати помилку.
Аарон Бертран

4
@Aaron Bertrant - Моя відповідь включала, що конверсія не потрібна, починаючи з "Технічно парашер може дозволити вам піти з <остаточного зразка коду>. Я просто вважаю це більш читабельним, тому що напрочуд очевидно, що це дата-час. Занадто багато систем баз даних зберігають значення дат у полі varchar, але ви маєте рацію щодо формату. Зазвичай при використанні конверсії я також додаю в специфікатор формату, але я робив зразок у верхній частині мого голова
Давид

1
@AaronBertrand, мені довелося використовувати вашу пропозицію в поєднанні з вищезазначеною відповіддю: CONVERT(datetime, '20100401 10:01:01')- проходження 2010-04-01 працює в студії управління SQL Server, але не при відправці оператора 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.