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

Eri*_*cis 308 sql sql-server datetime

我尝试着:

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= 2010-04-01;
Run Code Online (Sandbox Code Playgroud)

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

但是,这不起作用.

任何人都可以提供参考原因吗?

Dav*_*vid 442

select *  
from dbo.March2010 A 
where A.Date >= Convert(datetime, '2010-04-01' )
Run Code Online (Sandbox Code Playgroud)

在您的查询中,2010-4-01被视为数学表达式,因此本质上它是读取的

select *  
from dbo.March2010 A 
where A.Date >= 2005; 
Run Code Online (Sandbox Code Playgroud)

(2010 minus 4 minus 1 is 2005 将其转换为正确的datetime,并使用单引号将解决此问题.)

从技术上讲,解析器可能允许你逃脱

select *  
from dbo.March2010 A 
where A.Date >= '2010-04-01'
Run Code Online (Sandbox Code Playgroud)

它将为您进行转换,但在我看来,它明显不如显式转换为DateTime将在您之后的维护程序员.

  • 显式转换不是必需的.另外,我强烈建议使用YYYYMMDD代替YYYY-MM-DD.为什么?好吧,用`SET LANGUAGE FRENCH`尝试你的代码.:-)对于那个日期,您将获得1月4日而不是4月1日.对于其他日期,您可能会收到错误. (35认同)
  • @Aaron Bertrant - 我的回答确实包括转换不是必需的,从"从技术上讲,pareser可能让你逃脱<最终代码示例>.我发现它更具可读性,因为它非常明显,这是一个日期时间.太多的数据库系统在varchar字段中存储日期值,但你对格式是正确的.通常,在使用转换时我也添加了格式说明符,但是我在我的顶部做了我的样本头. (4认同)
  • @AaronBertrand,我不得不将您的建议与上述答案结合使用:`CONVERT(datetime, '20100401 10:01:01')` - 传递 2010-04-01 在 SQL Server Management Studio 中有效,但在发送 SQL 时无效通过 PHP/MSSQL 语句。 (2认同)

Sli*_*SFT 51

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

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';
Run Code Online (Sandbox Code Playgroud)

  • 添加时间将给出确切的结果:其中 A.Date &gt;= 2014-01-12 12:28:00 (2认同)

Md.*_*kot 22

在您的查询中,您没有在日期周围使用单引号。这就是问题所在。但是,您可以使用以下任何查询来比较日期

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


SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= CAST('2010-04-01' as Date);


SELECT *  
FROM dbo.March2010 A 
WHERE A.Date >= Convert(datetime, '2010-04-01' )
Run Code Online (Sandbox Code Playgroud)


dus*_*88c 14

我们也可以使用如下

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';
Run Code Online (Sandbox Code Playgroud)

  • 修改过滤器谓词列并不是一个好主意.它几乎完全阻止了索引的使用. (2认同)

小智 7

总结一下,正确答案是:

select * from db where Date >= '20100401'  (Format of date yyyymmdd)
Run Code Online (Sandbox Code Playgroud)

这将避免其他语言系统的任何问题,并将使用索引。