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


71

有没有一种方法可以使用Now()SQL中的函数来选择具有今天日期的值?

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


请发布您的表格结构。您表中的日期值是否包含时间成分?
Chetter Hummin's 2012年

请发布您想要的结果。
多科恩(Dor Cohen)

Answers:


78

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 date time,其中只有日期部分,而没有时间:

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

3
现在是使用选择ODBC函数所以可以在MSSQL被称为为{fn NOW()}
保罗

100

好的,让我们正确执行此操作。选择当下匹配的日期,并使用索引(如果有)并显示所有不同的日期/时间类型。

这里的原理在每种情况下都是相同的。我们会抓取日期列在最近的午夜(今天的时间为00:00:00)或之后,下一个午夜(明天的时间为00:00:00的日期)之前或之后的行,但不包括具有该确切值的任何内容)。

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

为了使事情顺利进行,我们明确避免对存储在数据库中的日期进行任何操作(where下面所有示例中的子句的LHS )。这可能会触发全表扫描,因为必须为每个比较计算日期。(此行为似乎因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小提琴|分贝<>小提琴

使用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'
;

甲骨文: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小提琴

使用日期字符串:

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 Fiddle代码


1
使用CONVERT(VARCHAR“比较日期”不是最佳方法。这是更好地保持日期为日期(例如,CAST(CURRENT_TIMESTAMP AS DATE)DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP))stackoverflow.com/questions/1177449/...
GarethD

我实际上是在使用SQL Server之后?:)
变形2012年

第一个示例用于SQL Server。祝您查询愉快:)
dwurf'5年

7

不知道你在问什么!

然而

SELECT  GETDATE()

将为您获取当前日期和时间

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

您可以将日期设置为00:00:00


6

将日期的时间元素设为零即可。例如

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

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


5

不确定您到底想做什么,但听起来像是GETDATE()您在追求什么。GETDATE()返回日期时间,但是如果您对时间部分不感兴趣,则可以转换为日期。

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

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 Server计数高达.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

并非总是最好的事情。如果表中有一百万个日期,这将很快破坏您的执行计划。
dwurf

2

如果您有一个仅具有存储日期(无时间)的表,并且想通过“现在”获取这些表,则可以执行以下操作:

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

这将导致日差为0(今天是今天)的行。


d和您的日期是什么?
bobthebuilder

1
@bobthebuilder这是您的列或包含日期的变量
YvesR

0

您可以尝试以下sql代码;

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.