如何在SQL Server中仅使用date查询DATETIME字段?

简单的问题,但我无法设法解决它呢…

我有一个testing与DATETIME字段,如下所示:

ID NAME DATE 1 TESTING 2014-03-19 20:05:20.000 

我需要的是下面的查询返回这个行和每一行的date= 03/19/2014,无论什么时候是:

 select * from test where date = '03/19/2014'; 

但是它不返回行。 唯一的办法就是指定时间:

 select * from test where date = '03/19/2014 20:03:02.000'; 

提前致谢 !

使用范围或DateDiff函数

  select * from test where date between '03/19/2014' and '03/19/2014 23:59:59' 

要么

  select * from test where datediff(day, date, '03/19/2014') = 0 

其他选项是:

  1. 如果您可以控制数据库架构,并且不需要时间数据,那么就把它拿出来。

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

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' 

简单的答案;

 select * from test where cast ([date] as date) = '03/19/2014'; 

我正在使用MySQL 5.6,并且有一个DATE函数从date时间只提取date部分。 所以问题的简单解决scheme是 –

  select * from test where DATE(date) = '2014-03-19'; 

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

尝试这个

  select * from test where Convert(varchar, date,111)= '03/19/2014' 

你可以试试这个

 select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014'; 
 select * from test where date between '03/19/2014' and '03/19/2014 23:59:59' 

这是一个真正的不好的答案。 有两个原因。

1. 23.59.59.700等时间会发生什么情况,次数多于23:59:59。

2.行为取决于数据types。 对于datetime / date / datetime2types,查询的行为不同。

使用23:59:59.999进行testing更加糟糕,因为根据datetypes的不同,您会得到不同的取整。

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

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

你可以使用这个截断时间部分的方法:

 select * from test where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0) 

date和语言有一个问题,避免它的方式是要求这种格式的dateYYYYMMDD。

根据下面的链接,下面的这种方式应该是最快的。 我检查了SQL Server 2012,我同意这个链接。

 select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903'); 

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

问候。

testing这个查询。

 SELECT *,DATE(chat_reg_date) AS is_date,TIME(chat_reg_time) AS is_time FROM chat WHERE chat_inbox_key='$chat_key' ORDER BY is_date DESC, is_time DESC 

只需在你的WHERE子句中使用这个。

下面的“SubmitDate”部分是列名,所以插入你自己的。

这将只返回结果的“年份”部分,省略分钟等。

 Where datepart(year, SubmitDate) = '2017' 
 select * from invoice where TRANS_DATE_D>= to_date ('20170831115959','YYYYMMDDHH24MISS') and TRANS_DATE_D<= to_date ('20171031115959','YYYYMMDDHH24MISS'); 
 -- Reverse the date format -- this false: select * from test where date = '28/10/2015' -- this true: select * from test where date = '2015/10/28'