简单的问题,但我无法解决它......
我有一个带有DATETIME字段的表TEST,如下所示:
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';
提前致谢!
答案 0 :(得分:91)
使用范围或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
其他选项包括:
如果您可以控制数据库架构,那么您就不需要了 时间数据,把它拿出来。
或者,如果必须保留它,请添加一个计算列属性,该属性将日期值的时间部分剥离...
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'
答案 1 :(得分:39)
简单回答;
select * from test where cast ([date] as date) = '03/19/2014';
答案 2 :(得分:18)
我正在使用MySQL 5.6,并且有一个DATE函数只从日期时间中提取日期部分。所以这个问题的简单解决方案是 -
select * from test where DATE(date) = '2014-03-19';
http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html
答案 3 :(得分:3)
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。 行为取决于数据类型。 该查询对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'))
- 对于日期,该值为“切碎”。 - 对于datetime,该值将向上舍入到下一个日期。 (最近的价值)。 - 对于datetime2,该值是精确的。
答案 4 :(得分:2)
试试这个
select * from test where Convert(varchar, date,111)= '03/19/2014'
答案 5 :(得分:1)
你可以试试这个
select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
答案 6 :(得分:1)
这适用于MS SQL服务器:
select * from test
where
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;
答案 7 :(得分:0)
使用 trunc(column)。
select * from test t where trunc(t.date) = TO_DATE('2018/06/08', 'YYYY/MM/DD')
答案 8 :(得分:0)
使用此
select * from TableName where DateTimeField > date() and DateTimeField < date() + 1
答案 9 :(得分:0)
select *
from invoice
where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));
答案 10 :(得分:0)
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'
“col1”是具有日期和时间的列的名称
&lt;列的名称&gt;在这里你可以根据需要更改名称
答案 11 :(得分:0)
只需在WHERE
子句中使用它。
下面的“SubmitDate”部分是列名,因此请插入您自己的名称。
这将仅返回结果的“年份”部分,省略分钟等。
Where datepart(year, SubmitDate) = '2017'
答案 12 :(得分:0)
日期和语言存在问题,避免这种情况的方法是询问YYYYMMDD格式的日期。
根据以下链接,以下方式应该是最快的。我检查了SQL Server 2012,我同意这个链接。
select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');
答案 13 :(得分:0)
-- Reverse the date format
-- this false:
select * from test where date = '28/10/2015'
-- this true:
select * from test where date = '2015/10/28'
答案 14 :(得分:0)
您可以使用此方法截断时间部分:
select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)
答案 15 :(得分:-1)
select * from invoice where TRANS_DATE_D>= to_date ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date ('20171031115959','YYYYMMDDHH24MISS');
答案 16 :(得分:-1)
测试此查询。
program.cs
答案 17 :(得分:-2)
SELECT * FROM test where DATEPART(year,[TIMESTAMP]) = '2018' and DATEPART(day,[TIMESTAMP]) = '16' and DATEPART(month,[TIMESTAMP]) = '11'