在处理日期范围时,我经常使用DATEADD
函数,特别是在处理滚动时间段时,如果我想查看过去6个月的所有结果,我当然会使用...WHERE [DateField] BETWEEN DATEADD(mm,-6,GETDATE()) AND GETDATE()
......那会显示从2022年7月20日到今天2023年1月20日的所有信息。
但是如果我想查看从7月 * 开始 * 的所有内容,如果我想查看从6个月前的任何月份开始的所有内容,或者我指定的任何时间段,而不必手动插入日期,该怎么办?
我试了以下方法...WHERE [DateField] BETWEEN DATEADD(mm,-6,(DATEPART(m,GETDATE()))) AND GETDATE()
......试图让它专注于月份,但由于某种原因,现在我突然从我正在使用的这个表中获得了“所有"结果,其中的数据可以追溯到2014年。我认为我在逻辑上走对了路,但显然有些地方不太对劲。
3条答案
按热度按时间htrmnn0y1#
原因
一个很好的故障排除步骤是查看date函数返回的值。例如,可以执行以下
SELECT
语句:这将返回一个日期
1899-07-02 00:00:00:00
,它实际上将WHERE子句转换为:WHERE [DateField] BETWEEN '1899-07-02' AND '2023-01-20
这就解释了查询返回表中所有记录的原因。
溶液
首先,可以将当前日期截断为当前月份的第一天:
输出:
2023-01-01 00:00:00
现在添加另一个DATEADD函数以减去六个月:
输出:
2022-07-01 00:00:00
把一切放在一起
qxgroojn2#
对于日历表(或者函数,如果您不想具体化实际的表)来说,这是一个很好的用例。
考虑:
然后可以这样使用:
在本例中,我通过为@StartYear和@EndYear传递1来请求当前日期之前的一年和之后的一年
然后,您可以通过从查询联接到它来使用它:
y0u0uwnf3#
如果您使用的是SQL Server 2012或更高版本,则可以使用
EOMONTH
函数,如下所示。就我个人而言,我喜欢把这类事情分解成变量,我从来不使用between。