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

mez*_*hic 66 sql sql-server current-time

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

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

dwu*_*urf 92

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

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

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

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

MS SQL服务器:(SQL小提琴 | 分贝<>小提琴)

首先,使用DATE

select * from dates 
where dte = CAST(CURRENT_TIMESTAMP AS DATE)
;
Run Code Online (Sandbox Code Playgroud)

现在使用DATETIME:

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

最后使用DATETIME2:

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

MySQL的:(SQL小提琴 | 分贝<>小提琴)

使用日期:

select * from dates 
where dte = cast(now() as date)
;
Run Code Online (Sandbox Code Playgroud)

使用DATETIME:

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

PostgreSQL的:(SQL小提琴 | 分贝<>小提琴)

使用日期:

select * from dates 
where dte = current_date
;
Run Code Online (Sandbox Code Playgroud)

使用TIMESTAMP不带时区:

select * from timestamps
where ts >= 'today'
and ts < 'tomorrow'
;
Run Code Online (Sandbox Code Playgroud)

甲骨文:(SQL小提琴)

使用日期:

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

使用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
;
Run Code Online (Sandbox Code Playgroud)

SQLite的:(SQL小提琴)

使用日期字符串:

select * from dates 
where dte = (select date('now'))
;
Run Code Online (Sandbox Code Playgroud)

使用日期和时间字符串:

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

使用unix时间戳:

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

备份SQL小提琴代码


Die*_*ego 73

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

select GETDATE() --2012-05-01 10:14:13.403
Run Code Online (Sandbox Code Playgroud)

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

select DAY(getdate())  --1
select month(getdate())  --5
select year(getdate()) --2012
Run Code Online (Sandbox Code Playgroud)

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

select cast (GETDATE() as DATE) --2012-05-01
Run Code Online (Sandbox Code Playgroud)

  • 现在是一个ODBC函数,因此可以使用select {fn Now()}在MSSQL中调用 (3认同)

Dav*_*ton 7

不确定你的要求!

然而

SELECT  GETDATE()
Run Code Online (Sandbox Code Playgroud)

会告诉你当前的日期和时间

SELECT  DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Run Code Online (Sandbox Code Playgroud)

只需将时间设置为00:00:00即可获得


Jon*_*yce 5

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

SELECT  GETDATE()
SELECT  CAST(GETDATE() AS DATE)
Run Code Online (Sandbox Code Playgroud)


Pau*_*aul 5

只关闭日期的时间元素.例如

SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
Run Code Online (Sandbox Code Playgroud)

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