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

时间:2013-02-03 07:30:36

标签: sql sql-server tsql sql-server-2005

我的问题是,

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

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

请帮助我。

3 个答案:

答案 0 :(得分:5)

将功能应用于列会使您的查询non-sargable,并且会使您的Cardinality Estimation陷入困境。

请改用间隔。

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

注意:The dateformat YYYY-MM-DD is not always interpreted the way you think in SQL Server

为避免日期解释含糊不清,请使用通用日期格式文字'YYYYMMDD'。

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')

答案 1 :(得分:1)

由于您的数据存储时间很长,因此您需要Cast只需要日期。

试试这个:

SELECT  * 
FROM tablename 
WHERE CAST(columnName as DATE) = '2013-02-01'

根据您的SQL Server版本(如果它不支持DATE数据类型),您可以使用:

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'))
祝你好运。

答案 2 :(得分:0)

SELECT *
FROM   tablename 
WHERE  CONVERT(VARCHAR, columnname, 103) = '01/01/2013'