如何使用仅包含日期的值针对“DateTime”类型的列构造SQL搜索条件?

如何使用仅包含日期的值针对“DateTime”类型的列构造SQL搜索条件?,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,我的问题是, 我在SQL表中有一个DateTime类型的列,它包含如下值 2013-02-01 10:00:00.000 2013-01-27 16:00:00.000 2013-02-01 14:00:00.000 如果我只在Where子句中提到日期,我如何通过查询获得结果,如: SELECT * FROM tablename WHERE columnName = '2013-02-01' 执行此查询后,我希望得到此结果 2013-02-01 10:00:00.000 2013-02

我的问题是,

我在SQL表中有一个DateTime类型的列,它包含如下值

2013-02-01 10:00:00.000
2013-01-27 16:00:00.000
2013-02-01 14:00:00.000
如果我只在Where子句中提到日期,我如何通过查询获得结果,如:

SELECT *
FROM   tablename
WHERE  columnName = '2013-02-01'
执行此查询后,我希望得到此结果

2013-02-01 10:00:00.000
2013-02-01 14:00:00.000

请在这方面帮助我。

因为您的数据是与时间一起存储的,所以您需要将这些数据转换为日期

试试这个:

SELECT  * 
FROM tablename 
WHERE CAST(columnName as DATE) = '2013-02-01'
根据您的SQL Server版本,如果它不支持日期数据类型,您可以使用:

SELECT  * 
FROM tablename 
WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, columnName)) = DATEADD(dd, 0, DATEDIFF(dd, 0, '2013-02-01'))
编辑-正如其他人正确指出的,在上面的示例中,您将失去从该列的表索引中获得的任何性能。在这种情况下,给定一个输入参数2013-01-01,这应该是您想要的:

SELECT *
FROM tablename
WHERE columnName >= CONVERT(datetime,'2013-01-01')
  AND columnName < DATEADD(dd, 1, CONVERT(datetime,'2013-01-01'))

祝你好运。

对该列应用函数将使你的查询失败,并将使你的查询陷入混乱

SELECT *
FROM   tablename 
WHERE  CONVERT(VARCHAR, columnname, 103) = '01/01/2013'
用一个间隔代替

select *
from tablename
where columnName >= '20130201' and
      columnName < '20130202'

错误:类型日期不是已定义的系统类型。注意:我使用的是SQL Server 2005您使用的是哪一版本的SQL Server?我使用的是SQL Server 2005这是因为日期转换-请尝试以下方法:@FahadHussain:如果有效,则表示这是一个好的解决方案。第二个解决方案并非如此。你应该看看米凯尔·埃里克森的答案。@米凯尔·埃里克森:为什么人们强迫我接受你的答案,尽管你的答案不符合我的要求。“间隔”对我不起作用,因为只有一个输入日期。@MikaelEriksson,但您的查询不符合我的要求。没有人强迫您做任何事情。如果您只想使用一个参数,请像这样做。
set language German
go
select convert(datetime, '1989-06-12'),
       convert(datetime, '19890612'),
       convert(datetime2, '1989-06-12'),
       convert(datetime2, '19890612'),
       convert(date, '1989-06-12'),
       convert(date, '19890612')