最近六个 "full"个月的 SQL

标签 sql sql-server

我有一个包含一个日期时间列的表。我只需要返回最近 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/

相关文章:

sql - sql server全文索引什么时候更新?

SQL:搜索具有给定值的列列表(在一行中)

mysql - 如何创建复合键?

.net - 数据库架构 API

与具有几百万行的表上的 "<>"相比,SQL Server "="运算符非常慢

sql-server - 由于源数据库正在运行复制,因此无法修改已还原数据库的存储过程

MySQL表分割

sql - 从 “anchor table”左外联接看到重复项

.net - 如何跨多个开发人员管理和捕获数据库更改?

sql-server - MS Sql Server 性能 UPDATing 单列与所有​​列