2012-05-17 2147 views
199

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

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

A.Date样子:2010-03-04 00:00:00.000

但是,这是行不通的。任何人都可以提供一个参考为什么?

+9

把单引号周围 –

+0

除引号,我建议您始终使用安全且明确的格式来保存仅限日期的字符串文字。我唯一信任的是YYYYMMDD。看到我的评论,大卫的答案为什么...... –

回答

290
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为维护程序员会来找你的可读性。

+21

显式转换是没有必要的。另外我强烈建议使用YYYYMMDD而不是YYYY-MM-DD。为什么?那么,用'SET LANGUAGE FRENCH'试试你的代码。 :-)那天你会得到1月4日而不是4月1日。对于其他日期,你可能会得到一个错误。 –

+3

@Aaron Bertrant - 我的答案确实包括了转换不是必须的,从“从技术上讲,pareser可能让你逃避。我发现它更具可读性,因为它很明显,这是一个日期 - 时间太多的数据库系统将日期值存储在一个varchar字段中,但是你对这种格式是正确的。通常,当使用转换时,我还要添加格式说明符,但是我正在做我的样本我的头。 – David

+1

@AaronBertrand,我不得不使用你的建议与上述答案结合:'CONVERT(datetime,'20100401 10:01:01')' - 传递2010-04-01在SQL Server Management Studio中工作,但不当通过PHP/MSSQL发送SQL语句时 – paperclip

39

试着把你的日期放入一个字符串中。

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

添加时间会给出确切的结果:其中A.Date> = 2014-01-12 12:28:00 – stom

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

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

先转换成TexBox日期时间,然后....使用该变量到查询

7

我们可以使用如下以及

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

相关问题