我有一个包含一个日期时间列的表。我只需要返回最近 6 个月的行。这可以通过
WHERE CloseTime >= DATEADD(Month, DATEDIFF(Month, 0, DATEADD(m, - 6, CURRENT_TIMESTAMP)), 0)
这为我提供了我启动此脚本的月份 + 上 6 个月的数据。所以例如如果我今天运行这个脚本,我将获得这个月的数据以及直到 4 月 (04) 为止的所有前几个月的数据。
现在我需要修改条件,如果我今天运行脚本,将只获取 03-09 月份的数据,不包括本月 (10) 的天数。
有什么建议吗?
最佳答案
如果不管今天是 1 号、3 号、9 号、29 号还是什么,你都想要前 6 个月,那么只需减去 7 个月。这是一种方法:将月份的第一天放入变量中,然后在查询中使用开放式范围。
DECLARE @ThisMonth DATETIME;
SET @ThisMonth = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101');
SELECT...
WHERE CloseTime >= DATEADD(MONTH, -7, @ThisMonth)
AND CloseTime < @ThisMonth;
你也可以使用 0
代替 '19000101'
但我更喜欢明确的日期而不是隐含的速记(这是一个很难改掉的习惯)。
如果您真的不喜欢变量,那么您可以通过重复表达式来计算本月的第一天(并在范围的开头,从月数中减去 7)来使查询变得更加复杂:
SELECT...
WHERE CloseTime >= DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE())-7, '19000101')
AND CloseTime < DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101');
哎呀。变量使这一切变得更加整洁。
关于最近六个 "full"个月的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19296873/