如何在SQL Server中查询大于某个日期的所有日期?


338

我尝试着:

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

A.Date 好像: 2010-03-04 00:00:00.000

但是,这不起作用。

谁能提供为什么的参考?


17
用单引号引起来
Kevin DiTraglia,2012年

2
除引号外,我建议始终对仅日期的字符串文字使用安全且明确的格式。我唯一信任的是YYYYMMDD。请参阅我对David的回答的评论,以了解其原因...
Aaron Bertrand

Answers:


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为您之后的维护程序员显式转换为a可读性强。


37
显式转换不是必需的。另外,我强烈建议您使用YYYYMMDD而不是YYYY-MM-DD。为什么?好吧,尝试使用编写代码SET LANGUAGE FRENCH。:-)对于该日期,您将获得1月4日而不是4月1日。对于其他日期,您可能会得到一个错误。
亚伦·伯特兰

4
@Aaron Bertrant-我的回答的确包括了不必要的转换,首先是“从技术上讲,解析器可能会让您摆脱<final code sample>。我只是发现它更易读,因为它显然是date-time。太多的数据库系统将日期值存储在varchar字段中,但是您使用的格式是正确的,通常,在使用转换时,我也会添加格式说明符,但是我在我的顶部做示例头
大卫

1
@AaronBertrand,我不得不将您的建议与上述答案结合使用:CONVERT(datetime, '20100401 10:01:01')-传递2010-04-01在SQL Server Management Studio中有效,但在通过PHP / MSSQL发送SQL语句时则无效。
paperclip

我认为这已经很清楚了,因此不必进行转换。
雅克·马修

56

尝试将日期括在字符串中。

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

2
添加时间会得出确切的结果:其中A.Date> = 2014-01-12 12:28:00
shaijut 2015年

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,然后....在查询中使用该变量


3

综上所述,正确的答案是:

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

这样可以避免其他语言系统出现任何问题,并将使用索引。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.