如何在SQL中获取当前日期最近六个月的前一个月数据

Posted

技术标签:

【中文标题】如何在SQL中获取当前日期最近六个月的前一个月数据【英文标题】:How to Get first one month data from last six month from current date in SQL 【发布时间】:2022-01-03 12:11:58 【问题描述】:

我们如何修改以下脚本以获取过去 6 个月的第一个月数据?

  select datetimeInsert, Part_no,qty
  FROM  RECEIPT 
  where 
  datediff(month, datetimeInsert, getdate()) <= 6

=> 跳过最近 5 个月的数据,仅显示前 6 个月的第 1 个月数据

【问题讨论】:

问题不清楚但可能datediff(month, datetimeInsert, getdate()) = 6 您想要 a) 最近 6 个月的数据还是 b) 6 个月前一个月的数据?这是 a) 特定日期(如从 10 日到 9 日)还是 b) 特定月份(如从 5 月到今天)? @KnutBoehnert :我需要跳过最后 5 个月的数据并仅显示第 6 个月。 (仅显示可能) 嗨@SamBinHam 如果我的回答对您有帮助,您可以接受它作为答案(单击答案旁边的复选标记将其从灰色切换为已填充。)。这对其他社区成员可能是有益的。谢谢。 【参考方案1】:

因此,如果您只想要 6 个月前的月份的数据,请使用 equal 而不是 小于

select datetimeInsert, Part_no,qty
  from receipt 
 where datediff(month, datetimeInsert, getdate()) = 6

编辑 1:@larnu 的一个好点是,在 DATEDIFF() 函数内使用 datetimeInsert 列使该查询减少了 sargeable,即它将无法利用使用索引.

您可以在不牺牲 sargeability 的情况下实现同样的效果:

select datetimeInsert, Part_no,qty
  from receipt 
 where datetimeInsert >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, DATEADD(MONTH, -7, GETDATE())))
   and datetimeInsert < DATEADD(DAY, 0, DATEDIFF(DAY, 0, DATEADD(MONTH, -6, GETDATE())));

注意:我刚刚意识到第二个查询不仅查看月份,还查看 7 到 6 个月前的时间段。因此,您将获得 7 到 6 个月前的结果,而不是当月前 6 个月的结果。如果您想要后者(实际上与问题中的原始查询相同),您将在@larnu's answer 中找到解决方案。

编辑 2:正如 @Jeff 所评论的,使用 DATEADD(MONTH, -7, GETDATE()) 之类的表达式时的时间边界将是截至今天 7 个月前的日期时间在这个确切时间。我已经更新了上面的语句和下面的 dbfiddle 来解决这个问题并突出差异。

见db<>fiddle。

【讨论】:

嗯,这不是特别可搜索的。日期边界通常是要走的路。 感谢您的评论,我将其编辑到我的问题中 哦,刚刚注意到您添加了自己的答案。猜猜我会投票赞成...... @buddemat - 请注意您了解声明中包含的时间界限。从今天减去 7 个月,您将得到正好 7 个月前的今天此时 @Jeff 感谢您引起我的注意!我完全忽略了这一点。为了完整起见,我更新了我的帖子。【参考方案2】:

似乎您应该使用日期边界。所以是这样的:

SELECT datetimeInsert,
       Part_no,
       qty
FROM dbo.receipt
WHERE datetimeInsert >= DATEADD(DAY, 1, EOMONTH(GETDATE(),-7))
  AND datetimeInsert < DATEADD(DAY, 1, EOMONTH(GETDATE(),-6));

EOMONTH 获取月底的日期。因此,例如,EOMONTH(GETDATE(),-7) 返回 7 个月前一个月内的最后一个 dateGETDATE() 是今天,然后第二个参数是 7 个月前)。所以今天,那将是2021-04-30。然后,我将一天添加到价值中,以获得 6 个月前一个月的第一天:2021-05-01。然后,我对 5 月/6 月使用相同的逻辑。

因此,这最终要求 datetimeInsert 的值 >= 2021-05-01 并且 每个日期和时间值。

【讨论】:

您还可以使用更常见的计算方法:DATEADD(month, DATEDIFF(month, 0, GETDATE()) - 6, 0) 和 DATEADD(month, DATEDIFF(month, 0, GETDATE() ) - 5, 0) 我可以,但我发现EOMONTH 方法更“干净”@Jeff。 如果 datetimeInsert 是一个日期时间列,您的计算将包括一个隐式转换,因为 EOMONTH 返回一个日期数据类型。如果然后对列而不是计算值执行该隐式转换,则可能会导致基数估计器出现问题。 "如果该隐式转换随后在列上执行"它不会是,@Jeff,由于Data Type Precedence。【参考方案3】:

我认为您可以通过对查询进行微小更改来实现此目的。 除了&lt;=6,您可以使用=0。这将为您提供最近 1 个月的数据。

所以查询看起来像,

  select datetimeInsert, Part_no,qty
  FROM  RECEIPT 
  where 
  datediff(month, datetimeInsert, getdate()) = 0

如果您需要last month 数据,请使用= 1

喜欢,

select datetimeInsert, Part_no,qty
  FROM  RECEIPT 
  where 
  datediff(month, datetimeInsert, getdate()) = 1

【讨论】:

以上是关于如何在SQL中获取当前日期最近六个月的前一个月数据的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 Power BI 报表中选定的月份筛选器在 MDX 查询中显示最近六个月的数据(每个月一行)?

如何在SHELL获取当天时间的月份和上个月的月份还有下个月的月份

根据当前日期获取前 3 个月的数据 - MySQL

如何使用 datetime Python 模块计算距当前日期六个月的日期?

如何从当前日期 PHP 获取最近 7 周、7 个月的日期范围?

如何用sql的日期函数,分别查出1月~12月每个月的销售金额?