如何在某一天通过时在SQL中检索记录



我想检索某些日期的记录。

 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 (使用小于或等于/大于或等于)。

最新更新