有没有办法使用的方式Now()
函数在SQL选择今天的日期值?
我的印象是Now()
将包含时间和日期,但今天的日期将有时间为00:00:00
,因此这将不会匹配?
有没有办法使用的方式Now()
函数在SQL选择今天的日期值?
我的印象是Now()
将包含时间和日期,但今天的日期将有时间为00:00:00
,因此这将不会匹配?
没有原生现在在SQL Server,所以你应该使用()函数:
select GETDATE() --2012-05-01 10:14:13.403
您可以通过执行获得的日,月和年分别:
select DAY(getdate()) --1
select month(getdate()) --5
select year(getdate()) --2012
如果你的SQL Server 2008上,有它只有日期部分,而不是时间日期日期时间:
select cast (GETDATE() as DATE) --2012-05-01
OK,让我们这样做正确。 请选择日期今天匹配,如果使用可用的索引,所有存在的不同日期/时间类型。
这里的原则是在每种情况下是相同的。 我们抢行,其中的日期列上或最近的午夜之后(今天的日期与时间00:00:00),以及接下来的午夜(第二天的日期与时间00:00:00,但不包括任何与精确值前)。
对于纯日期类型,我们可以用今天的日期进行简单的比较。
为了保持又好又快,我们明确地避免对存储在数据库中的日期做任何操作(的LHS的where
在下面所有的例子条款)。 这将有可能引发全表扫描的日期将不得不计算每一个对比。 (这种现象出现由DBMS,YMMV到变化)。
MS SQL服务器( SQL小提琴 | 分贝<>小提琴 )
首先,使用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小提琴 | 分贝<>小提琴 )
使用日期:
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小提琴 | 分贝<>小提琴 )
使用日期:
select * from dates
where dte = current_date
;
使用TIMESTAMP无时区:
select * from timestamps
where ts >= 'today'
and ts < 'tomorrow'
;
甲骨文:( 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
;
使用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小提琴 )
使用日期字符串:
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'))
;
SQL的代码拨弄备份
不知道你问什么!
然而
SELECT GETDATE()
将让你的当前日期和时间
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
将让你只是日期时间为00:00:00
不知道你想什么做的,但它听起来像GETDATE()
是你追求的。 GETDATE()
返回datetime,但如果你不感兴趣的时间组件,那么你可以转换为日期。
SELECT GETDATE()
SELECT CAST(GETDATE() AS DATE)
只需调零关闭日期的时间元素。 例如
SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
我用GETDATE因为这是一个MSSQL功能,为你添加了标签,但Now()
可能是MySQL或正在使用的ODBC函数调用,如果你只是更换一个与其他仍然应该工作。
在以前的答案的基础上,请注意很重要的一点,你还需要操纵你的表列 ,以确保它不包含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服务器数高达0.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
如果你只是一个存储日期(无时间)的表,并希望得到那些由“现在”,那么你可以这样做:
SELECT * FROM tbl WHERE DATEDIFF(d, yourdate, GETDATE())=0
这导致行(所以今天)这天差为0。
你可以试试这个SQL代码;
SELECT [column_1], [column_1], ...
FROM (your_table)
where date_format(record_date, '%e%c%Y') = date_format(now(), '%e%c%Y')
你可以试试:
WHERE created_date BETWEEN CURRENT_TIMESTAMP-180 AND CURRENT_TIMESTAMP