如何在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 个月前一个月内的最后一个 date
(GETDATE()
是今天,然后第二个参数是 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】:
我认为您可以通过对查询进行微小更改来实现此目的。
除了<=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获取当天时间的月份和上个月的月份还有下个月的月份
如何使用 datetime Python 模块计算距当前日期六个月的日期?