我的问题是,
我在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
请帮助我。
答案 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'