我意识到这是一个相对基本的问题,但是日期时间总是搞砸了我,我想确保我正确地做到这一点(这次审计将被提升为老板)。使用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
答案 0 :(得分:7)
如果transactionDate
为DATETIME
,则为:
AND CONVERT(DATE, TransactionDate) = CONVERT(DATE, CURRENT_TIMESTAMP);
如果transactionDate
为DATE
,则为:
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,所以我倾向于忘记这样的事情:(