3

我的问题是,

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

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

请帮助我。

4

3 回答 3

5

将函数应用于列将使您的查询不可分析,并且会弄乱您的Cardinality Estimation

请改用间隔。

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

注意:日期格式YYYY-MM-DD并不总是按照您在 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')
于 2013-02-03T09:43:32.197 回答
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'))

祝你好运。

于 2013-02-03T07:31:41.543 回答
0
SELECT *
FROM   tablename 
WHERE  CONVERT(VARCHAR, columnname, 103) = '01/01/2013'
于 2013-02-03T08:02:36.820 回答