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

时间:2014-03-19 13:10:57

标签: sql-server datetime

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

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

提前致谢!

18 个答案:

答案 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

其他选项包括:

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

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

  3. 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'