对比今天的日期的结果吗?(Comparing results with today's da

2019-06-24 02:16发布

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

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

Answer 1:

没有原生现在在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


Answer 2:

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的代码拨弄备份



Answer 3:

不知道你问什么!

然而

SELECT  GETDATE()

将让你的当前日期和时间

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

将让你只是日期时间为00:00:00



Answer 4:

不知道你想什么做的,但它听起来像GETDATE()是你追求的。 GETDATE()返回datetime,但如果你不感兴趣的时间组件,那么你可以转换为日期。

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


Answer 5:

只需调零关闭日期的时间元素。 例如

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

我用GETDATE因为这是一个MSSQL功能,为你添加了标签,但Now()可能是MySQL或正在使用的ODBC函数调用,如果你只是更换一个与其他仍然应该工作。



Answer 6:

在以前的答案的基础上,请注意很重要的一点,你还需要操纵你的表列 ,以确保它不包含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


Answer 7:

如果你只是一个存储日期(无时间)的表,并希望得到那些由“现在”,那么你可以这样做:

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

这导致行(所以今天)这天差为0。



Answer 8:

你可以试试这个SQL代码;

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


Answer 9:

你可以试试:

WHERE created_date BETWEEN CURRENT_TIMESTAMP-180 AND CURRENT_TIMESTAMP


文章来源: Comparing results with today's date?