我想检索某些日期的记录。
DateTime BETWEEN DATEADD(dd,-1* 30,GETDATE()) and GETDATE()
上面的代码获取从今天到30天的所有记录,但我只想要第30天的记录,而不是介于两者之间的所有记录。我如何实现这一点?
但它并不总是 30 天,如果我输入 5 天,它必须只给我第 5 天的记录等
返回从今天起第 -30 天的日期的数据。
SELECT * FROM TABLENAME
WHERE DATEDIFF(day, CONVERT(VARCHAR(10), GETDATE(),110),
CONVERT(VARCHAR(10), COLUMNNAME,110)) = -30
试试这个:
这是返回今天的日期= 18
DATEPART(Day,MyColumn)=30
好吧,如果你关心时间:
DateTime >= DATEADD(dd, -30, GETDATE()) and DateTime < DATEADD(dd, -29, GETDATE())
如果需要标准日期定义:
DateTime >= DATEADD(dd, -30, cast(GETDATE() as date)) and DateTime < DATEADD(dd, -29, cast(GETDATE() as date))
两个音符。 首先,我不鼓励您将between
与日期和日期时间一起使用。 当存在时间组件时,它们通常不会按预期执行。 养成使用显式比较(与>=
和<
)的习惯可能会防止将来出现问题。
其次,请注意,列DateTime
不是任何函数的一部分。 所有的"算术"都在getdate()
. 这使表达式保持可优化处理,因此可以使用索引(如果可用)。
你做这样的事情:
WHERE Cast(DateTime as DATE) = DATEADD(dd,-30,GETDATE())
但这不是可优化的,因为对于列的每一行,"日期时间"都需要应用转换(Cast())。
相反,最好仍然使用 bet,但只选择 30 到 29 天前的数据:
WHERE DateTime BETWEEN DATEADD(dd,-30,GETDATE()) AND DATEADD(dd,-29,GETDATE())
根据您是否想要独占性,您可能需要使用小于/大于而不是 BETWEEN (使用小于或等于/大于或等于)。