检查订单仅适用于今天

时间:2013-03-22 20:32:42

标签: sql datetime sql-server-2008-r2

我意识到这是一个相对基本的问题,但是日期时间总是搞砸了我,我想确保我正确地做到这一点(这次审计将被提升为老板)。使用sql server 2008 r2。下面的一些sudo代码用于我想要的内容

我应该提到transactionDate目前是一个日期时间。这会改变一切吗?

DELCARE 
    @today datetime,
    @tomorrow datetime

SET @today = --CODE TO GET THE DATE FOR TODAY
SET @tomorrow = --CODE TO GET THE DATE FOR TOMORROW

SELECT *
FROM table
WHERE custID = '788'
    AND status = 'Cancelled'
    AND transactionDate --IS ONLY TODAY AND NOT TOMORROW OR ANY DAY AFTER

4 个答案:

答案 0 :(得分:7)

如果transactionDateDATETIME,则为:

AND CONVERT(DATE, TransactionDate) = CONVERT(DATE, CURRENT_TIMESTAMP);

如果transactionDateDATE,则为:

AND transactionDate = CONVERT(DATE, CURRENT_TIMESTAMP);

这两个仍将使用transactionDate上的索引,但这是一个特例。通常第一种形式会破坏可怜性。

答案 1 :(得分:2)

如果您正在处理日期,则应使用date数据类型。以下是您的查询版本:

SELECT *
FROM table
WHERE custID = '788'
    AND status = 'Cancelled'
    AND cast(transactionDate as date) = cast(getdate() as date)

您也可以将其写为:

select *
from table
where custId = '788' and status = 'Cancelled' and
      TransactionDate >= cast(getdate() as date) and
      TransactionDate < cast(getdate() + 1 as date)

我认为演员阵容阻止了索引的使用,但是Aaron在评论中对我有所启发。 Here是对SQL Server中的可用性的更广泛的解释。

答案 2 :(得分:0)

这可能对您有所帮助,只需将输入DATE

替换为GETDATE()即可

SELECT *
FROM table
WHERE custID = '788'
    AND status = 'Cancelled'
    AND DATEDIFF(DD,GETDATE(),transactionDate)=0

答案 3 :(得分:0)

正如其他人发布的那样,有几种方法可以做到这一点。

最好的方法是简单地设置

where transactionDate = @toDay

如果transactionDate只包含DATE部分(没有小时或分钟,所以在午夜),那么这种方法将起作用,然后@toDay是相同的,仅适用于GETDATE()或类似的。

正如ljh所写,你也可以在一天做一个DATEDIFF,但这会很广泛,因为它会在每一行都做DATEDIFF - 效率不高。

然而,您可以在日期之间进行检查,如下所示。

WHERE transactionDate >= '2013-03-22' and transactionDate < '2013-03-23'
--Substitute the chars for variables

这将为您提供在午夜和下午午夜之间发生transactionDate的所有行。

编辑:我刚刚看到戈登回答了同样的事情,并且包含了关于索引可用的部分,我忘了添加。

编辑:正如亚伦指出的那样,两者之间并不是一件好事。已经有一段时间了,因为我实际上写了任何非adhoc sql,所以我倾向于忘记这样的事情:(