如何仅使用SQL Server中的日期查询DATETIME字段?

del*_*les 73 sql-server datetime

简单的问题,但我还是无法解决它...

我有一个带有DATETIME字段的表TEST,如下所示:

ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000
Run Code Online (Sandbox Code Playgroud)

我需要的是下面的查询返回此行和每行的日期= 03/19/2014,无论什么时候是:

select * from test where date = '03/19/2014';
Run Code Online (Sandbox Code Playgroud)

但它不返回任何行.唯一的工作方式是指定时间:

select * from test where date = '03/19/2014 20:03:02.000';
Run Code Online (Sandbox Code Playgroud)

提前致谢 !

Cha*_*ana 106

使用范围或DateDiff函数

 select * from test 
 where date between '03/19/2014' and '03/19/2014 23:59:59'
Run Code Online (Sandbox Code Playgroud)

要么

 select * from test 
 where datediff(day, date, '03/19/2014') = 0
Run Code Online (Sandbox Code Playgroud)

其他选择是:

  1. 如果您可以控制数据库架构,并且不需要时间数据,请将其取出.

  2. 或者,如果你必须保留它,添加一个计算列属性,其中剥离了日期值的时间部分...

Alter table Test Add DateOnly As DateAdd(day, datediff(day, 0, date), 0)

或者,在更新版本的SQL Server中......

Alter table Test Add DateOnly As Cast(DateAdd(day, datediff(day, 0, date), 0) as Date)

然后,您可以简单地编写查询:

select * from test 
where DateOnly = '03/19/2014'
Run Code Online (Sandbox Code Playgroud)


小智 46

答案简单;

select * from test where cast ([date] as date) = '03/19/2014';
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个有效的答案,但我想指出将日期字段评估放在任何函数后面都会导致性能问题。日期上的任何索引都是无用的,引擎需要评估每一行 (4认同)

Gok*_*u__ 17

我正在使用MySQL 5.6,并且有一个DATE函数只从日期时间中提取日期部分.所以这个问题的简单解决方案是 -

 select * from test where DATE(date) = '2014-03-19';
Run Code Online (Sandbox Code Playgroud)

http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html

  • 问题是关于sql server的 (3认同)

小智 9

这适用于我的 MS SQL 服务器:

select * from test
where 
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;
Run Code Online (Sandbox Code Playgroud)


小智 8

select * from test 
where date between '03/19/2014' and '03/19/2014 23:59:59'
Run Code Online (Sandbox Code Playgroud)

这是一个非常糟糕的答案。有两个原因。

1. 像 23.59.59.700 等时间会发生什么。有些时间大于 23:59:59 和第二天。

2. 行为取决于数据类型。对于 datetime/date/datetime2 类型,查询的行为有所不同。

使用 23:59:59.999 进行测试会使情况变得更糟,因为根据日期类型,您会得到不同的舍入。

select convert (varchar(40),convert(date      , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime  , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime2 , '2014-03-19 23:59:59.999'))
Run Code Online (Sandbox Code Playgroud)

-- 对于日期,该值为“切碎”。-- 对于日期时间,该值向上舍入到下一个日期。(最近值)。-- 对于 datetime2,该值是精确的。