首页 > 解决方案 > 如何在 SQL 中过滤到上个月(避免一月份的问题)

问题描述

在 SQL 中,我希望提取仅适用于上个月的数据。这是我使用 DATEPART 函数完成的,它工作正常,我检查 DATEPART 函数中的“M”是否为当前日期的 -1。但是当我到了 1 月时,我遇到了问题,因为当然没有月份是 1 小于 1。

有没有办法避免一月份出现我不知道或想不到的 SQL 问题?

我当前的语法如下...

(DATEPART(M,p.renewal_date_key) = DATEPART(M,dateadd(M,-1,getdate()))

然后我有另一个 DATEPART 子句,它对 Year 执行相同的操作,以确保 Year 值与当前年份相同。

任何关于避免一月问题的替代方法的想法都会有很大帮助。

顺便说一下,这在 Microsoft 中也有使用(所以 SQL Server 也用于一些历史悠久的 Excel Power Querys)

标签: sqlsql-serverdatepart

解决方案


使用功能EOMONTH()

EOMONTH(renewal_date_key)您一起获得renewal_date_key' 月EOMONTH(GETDATE(), -1)的最后一天和上个月的最后一天的日期。
像这样写WHERE子句:

WHERE EOMONTH(renewal_date_key) = EOMONTH(GETDATE(), -1)

或者如果renewal_date_key的数据类型是DATE

WHERE renewal_date_key > EOMONTH(GETDATE(), -2)
  AND renewal_date_key <= EOMONTH(GETDATE(), -1)

推荐阅读