比较结果与今天的date?

有没有办法使用SQL中的Now()函数来select当今date的值? 我在印象之下Now()将包含时间和date,但今天的date将有时间设置为00:00:00,因此这将永远不会匹配?

在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上,有DATEdate时间只有date部分,而不是时间:

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

好的,让我们正确地做。 select与今天匹配的date,使用索引(如果可用)以及所有不同的date/时间types。

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

对于纯datetypes,我们可以和今天的date做一个简单的比较。

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

MS SQL Server: ( 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小提琴 )

使用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小提琴 )

使用date:

 select * from dates where dte = current_date ; 

在没有时区的情况下使用TIMESTAMP:

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

Oracle: ( SQL小提琴 )

使用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小提琴 )

使用datestring:

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

使用date和时间string:

 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() 

将得到您当前的date和时间

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

只要将时间设定为00:00:00就可以得到date

不确定你想要做什么,但听起来像GETDATE()是你在做什么。 GETDATE()返回一个date时间,但如果你对时间成分不感兴趣,那么你可以投射到一个date。

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

只需将date的时间元素归零即可。 例如

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

我已经使用GetDate,因为这是一个MSSQL函数,就像你已经标记的一样,但是Now()可能是MySQL,或者你正在使用ODBC函数调用,如果你只是用另一个replace,仍然应该工作。

build立在以前的答案上,请注意一个重要的一点,您还需要操纵您的表列以确保它不包含datetime数据types的时间片段。

以下是一个小示例脚本,演示了上述内容:

 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评论(感谢)之后,我想build议下面的代码。 我们在今天午夜(一天的开始)和一天的最后一个毫秒(SQL服务器数量达到.997,这就是为什么我减less3毫秒)之间创build一个date范围。 以这种方式,我们避免操纵左侧,避免性能影响。

 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 

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

 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') 

其中created_date在CURRENT_TIMESTAMP-180和CURRENT_TIMESTAMP之间