如何在 SQL 中为不同月份运行不同的日期范围

Posted

技术标签:

【中文标题】如何在 SQL 中为不同月份运行不同的日期范围【英文标题】:How to run different date ranges for different months in SQL 【发布时间】:2020-10-03 19:15:54 【问题描述】:

我需要自动生成报告的日期。用户每年运行四次报告。

Q1-jan-march-run may1

Q2-Apr-Jun - 运行 Aug1

Q3-July-Sep - 运行 Oct1

Q4-oct-dec - 运行 feb1

当用户在 5 月运行查询时,他应该得到 SELECT * FROM Table where DATE Between jan1 and march31 的结果。如何根据运行的月份编写不同的日期范围。

提前致谢。

【问题讨论】:

请用您正在运行的数据库标记您的问题:oracle, sql-server, mysql, ...?日期函数是高度特定于供应商的。 我正在使用 MS SQL SERVER 【参考方案1】:

您似乎想要过滤上一季度。这是一种方法:

select *
from mytable
where date >= dateadd(qq, datediff(qq, 0, getdate()) - 1, 0)
  and date <  dateadd(qq, datediff(qq, 0, getdate()), 0)

这会根据当前日期动态计算上一季度的开始和结束。

【讨论】:

【参考方案2】:

如果查询从当前月份减去 2 个月,则确定季度开始和结束的函数将始终返回正确的日期范围。像这样的

with example_run_dates as (
    select cast(v.dt as date) dt
    from (values ('20200501'), ('20200531'), ('20200801'), ('20200831'), 
                 ('20201001'), ('20201031'), ('20210201'), ('20210228')) v(dt))
select cast(dateadd(qq, datediff(qq, 0, mos.two_ago), 0) as date) start_dt,
       cast(dateadd(qq, datediff(qq, 0, mos.two_ago)+1, -1) as date) end_dt
from example_run_dates erd
     cross apply (select dateadd(month, -2, erd.dt) two_ago) mos;

输出

start_dt    end_dt
2020-01-01  2020-03-31
2020-01-01  2020-03-31
2020-04-01  2020-06-30
2020-04-01  2020-06-30
2020-07-01  2020-09-30
2020-07-01  2020-09-30
2020-10-01  2020-12-31
2020-10-01  2020-12-31

【讨论】:

【参考方案3】:

声明@FromDate NVARCHAR(255)、@ToDate NVARCHAR(255)

SET @FromDate = CASE WHEN MONTH(GETDATE()) = 5 THEN '20200101'

WHEN MONTH(GETDATE()) = 8 THEN '20200401'

WHEN MONTH(GETDATE()) = 10 THEN CONCAT(YEAR(GETDATE()),'0701')

WHEN MONTH(GETDATE()) = 2 THEN '20201001' 结束

SET @ToDate = CASE WHEN MONTH(GETDATE()) = 5 THEN '20200330'

WHEN MONTH(GETDATE()) = 8 THEN '20200630'

WHEN MONTH(GETDATE()) = 10 THEN CONCAT(YEAR(GETDATE()),'0930')

WHEN MONTH(GETDATE()) = 2 THEN '20201230' END

选择@FromDate、@ToDate

【讨论】:

不——我们不应该使用字符串变量来存储日期。我们也不应该假设此代码将仅且始终适用于 2020 年。当当前日期落在 11 月时,您的逻辑不一致并且将“起作用”当然无济于事。而依赖隐式数据类型转换只是另一个有待发现的问题。 您的逻辑将忽略 Q1 中 3 月的最后一天和 Q4 中 12 月的最后一天。

以上是关于如何在 SQL 中为不同月份运行不同的日期范围的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中每年在特定日期范围之间排除

如何识别 T-SQL 中每个不同成员的多个开始和结束日期范围中的第一个间隙

如何在 Hive SQL 中为日期列执行 BETWEEN 运算符

如何在 Geany 中为 PHP 范围设置与 HTML 范围不同的背景颜色?

在 SQL 中为给定年份设置硬编码的日期和月份

如何从 sql server 2008 中具有不同 TaskIds 的表中查找日期?