我有一个带有DATETIME
字段的表TEST,如下所示:
ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000
我需要的查询返回这一行和日期为2014年3月19日的每一行,无论时间是什么。我尝试使用
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
其他选项包括:
如果您可以控制数据库模式,并且不需要时间数据,取出。
或者,如果必须保留它,则添加一个计算列属性,该属性去掉了日期值的时间部分…
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函数只从日期时间中提取日期部分。因此,这个问题的简单解决方案是-
select * from test where DATE(date) = '2014-03-19';
http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html
这适用于MS SQL server:
select * from test
where
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;
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,该值是精确的。
使用此
select * from TableName where DateTimeField > date() and DateTimeField < date() + 1
你可以试试这个
select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
日期和语言有问题,避免问题的方法是要求使用这种格式YYYYMMDD的日期。
根据下面的链接,下面的方式应该是最快的。我签入了SQL Server 2012,并同意该链接。
select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');
- 要改掉的坏习惯:错误处理日期/范围查询
试试这个
select * from test where Convert(varchar, date,111)= '03/19/2014'
您可以使用这种方法来截断时间部分:
select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 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'
只需在WHERE
子句中使用即可。
下面的"SubmitDate"部分是列名,所以插入您自己的列名。
这将只返回结果的"年份"部分,忽略分钟等。
Where datepart(year, SubmitDate) = '2017'
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'
"col1"是包含日期和时间的列的名称
<列的名称>在这里,您可以根据需要更改名称
select *
from invoice
where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));
测试此查询。
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
select * from invoice where TRANS_DATE_D>= to_date ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date ('20171031115959','YYYYMMDDHH24MISS');
SELECT * FROM test where DATEPART(year,[TIMESTAMP]) = '2018' and DATEPART(day,[TIMESTAMP]) = '16' and DATEPART(month,[TIMESTAMP]) = '11'
使用trunc(column(。
select * from test t where trunc(t.date) = TO_DATE('2018/06/08', 'YYYY/MM/DD')