如何在Microsoft SQL Server中仅使用日期查询DATETIME字段



我有一个带有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

其他选项包括:

  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'

简单答案;

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

相关内容

  • 没有找到相关文章