如何在 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 中为不同月份运行不同的日期范围的主要内容,如果未能解决你的问题,请参考以下文章
如何识别 T-SQL 中每个不同成员的多个开始和结束日期范围中的第一个间隙
如何在 Hive SQL 中为日期列执行 BETWEEN 运算符