将结果与今天的日期进行比较?

时间:2012-05-01 08:47:26

标签: sql sql-server current-time

有没有办法在SQL中使用Now()函数来选择具有今天日期的值?

我的印象是Now()包含时间和日期,但是今天的日期会将时间设置为00:00:00,因此永远不会匹配?

11 个答案:

答案 0 :(得分:90)

好的,让我们这样做吧。选择今天匹配的日期,使用索引(如果可用),并显示所有不同的日期/时间类型。

这里的原则在每种情况下都是相同的。我们抓住日期列所在的行或最近午夜之后的行(今天的时间00:00:00)和下一个午夜之前(明天的日期时间00:00:00,但排除任何具有该确切值的行) )。

对于纯日期类型,我们可以与今天的日期进行简单比较。

为了保持良好和快速,我们明确避免对存储在DB中的日期进行任何操作(以下所有示例中的where子句的LHS)。这可能会触发全表扫描,因为必须为每次比较计算日期。 (此行为似乎因DBMS,YMMV而异。)

MS SQL Server:SQL Fiddle | db<>fiddle

首先,使用DATE

select * from dates 
where dte = CAST(CURRENT_TIMESTAMP AS DATE)
;

现在使用DATETIME:

select * from datetimes 
where dtm >= CAST(CURRENT_TIMESTAMP AS DATE)
and dtm < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE))
;

最后使用DATETIME2:

select * from datetimes2
where dtm2 >= CAST(CURRENT_TIMESTAMP AS DATE)
and dtm2 < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE))
;

MySQL:SQL Fiddle | db<>fiddle

使用DATE:

select * from dates 
where dte = cast(now() as date)
;

使用DATETIME:

select * from datetimes 
where dtm >= cast((now()) as date)
and dtm < cast((now() + interval 1 day) as date)
;

PostgreSQL:SQL Fiddle | db<>fiddle

使用DATE:

select * from dates 
where dte = current_date
;

使用TIMESTAMP不带时区:

select * from timestamps
where ts >= 'today'
and ts < 'tomorrow'
;

Oracle:SQL Fiddle

使用DATE:

select to_char(dte, 'YYYY-MM-DD HH24:MI:SS') dte
from dates 
where dte >= trunc(current_date)
and dte < trunc(current_date) + 1
;

使用TIMESTAMP:

select to_char(ts, 'YYYY-MM-DD HH24:MI:SS') ts
from timestamps
where ts >= trunc(current_date)
and ts < trunc(current_date) + 1
;

SQLite:SQL Fiddle

使用日期字符串:

select * from dates 
where dte = (select date('now'))
;

使用日期和时间字符串:

select dtm from datetimes
where dtm >= datetime(date('now'))
and dtm < datetime(date('now', '+1 day'))
;

使用unix时间戳:

select datetime(dtm, 'unixepoch', 'localtime') from datetimes
where dtm >= strftime('%s', date('now'))
and dtm < strftime('%s', date('now', '+1 day'))
;

Backup of SQL Fiddle code

答案 1 :(得分:70)

SQL Server中没有本机Now()函数,因此您应该使用:

select GETDATE() --2012-05-01 10:14:13.403

您可以通过以下方式分别获得日,月和年:

select DAY(getdate())  --1
select month(getdate())  --5
select year(getdate()) --2012

如果你在sql server 2008上,那么DATE日期时间只有日期部分,而不是时间:

select cast (GETDATE() as DATE) --2012-05-01

答案 2 :(得分:7)

不确定你的要求!

然而

SELECT  GETDATE()

将为您提供当前的日期和时间

SELECT  DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

只会将时间设置为00:00:00

答案 3 :(得分:5)

不确定您要做什么,但听起来GETDATE()就是您所追求的。 GETDATE()返回日期时间,但如果您对时间组件不感兴趣,则可以转换为日期。

SELECT  GETDATE()
SELECT  CAST(GETDATE() AS DATE)

答案 4 :(得分:5)

只关闭日期的时间元素。 e.g。

SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

我已经使用了GetDate这是一个MSSQL函数,因为你已经标记了,但是Now()可能是MySQL,或者你正在使用ODBC函数调用,如果你只是用另一个替换它,它仍然可以工作。

答案 5 :(得分:3)

在前面的答案的基础上,请注意一点,您还需要操作表列以确保它不包含datetime数据类型的时间片段。

以下是一个展示上述内容的小样本脚本:

select getdate()
--2012-05-01 12:06:51.413
select cast(getdate() as date)
--2012-05-01

--we're using sysobjects for the example
create table test (id int)
select * from sysobjects where cast(crdate as date) = cast(getdate() as date)
--resultset contains only objects created today
drop table test

我希望这会有所帮助。

修改
关于@dwurf评论(感谢)关于上述示例可能对性能产生的影响,我想建议以下内容。 我们创建了一个日期范围,从今天午夜(一天的开始)到一天的最后一毫秒(SQL服务器计数到.997,这就是为什么我减少了3毫秒)。通过这种方式,我们避免操纵左侧并避免对性能产生影响。

select getdate()
--2012-05-01 12:06:51.413
select dateadd(millisecond, -3, cast(cast(getdate()+1 as date) as datetime))
--2012-05-01 23:59:59.997
select cast(getdate() as date)
--2012-05-01

create table test (id int)
select * from sysobjects where crdate between cast(getdate() as date) and dateadd(millisecond, -3, cast(cast(getdate()+1 as date) as datetime))
--resultset contains only objects created today
drop table test

答案 6 :(得分:2)

如果你的表只有一个存储的日期(没有时间),并希望通过“现在”得到它们,那么你可以这样做:

SELECT * FROM tbl WHERE DATEDIFF(d, yourdate, GETDATE())=0

这导致行的日差为0(今天也是如此)。

答案 7 :(得分:0)

你可以试试这个sql代码;

   SELECT [column_1], [column_1], ...    
    FROM (your_table)
     where date_format(record_date, '%e%c%Y') = date_format(now(), '%e%c%Y') 

答案 8 :(得分:0)

您可以尝试:

WHERE created_date BETWEEN CURRENT_TIMESTAMP-180 AND CURRENT_TIMESTAMP

答案 9 :(得分:0)

这对我有用:

SELECT * FROM table where date(column_date) = curdate()

答案 10 :(得分:0)

对我来说,有效的查询,如果我想与 DrawDate 进行比较,例如:

CAST(DrawDate AS DATE) = CAST (GETDATE() as DATE)

这是将结果与今天的日期进行比较。

或整个查询:

SELECT TOP (1000) *
FROM test
where DrawName != 'NULL' and CAST(DrawDate AS DATE) = CAST (GETDATE() as DATE)
order by id desc