按月查找两个日期之间的天数

问题描述 投票:0回答:1

我有一个现有查询,其中每个行项目都有开始日期和结束日期。其中一些跨越几个月,如果是这种情况,我需要将其按月和年分成多行。

例如,查询当前返回以下内容。

姓名 开始日期 结束日期
测试1 2023-12-01 2024-01-15

我需要它最终看起来像这样。

姓名 开始日期 结束日期 年份 天数
测试1 2023-12-01 2024-01-15 十二月 2023 31
测试1 2023-12-01 2024-01-15 一月 2024 15

我在网上查看过,发现我可能会使用 CTE,但我不知道如何将其实现到我当前的查询中。

对于问题的任何格式问题,我们深表歉意。

sql snowflake-cloud-data-platform common-table-expression
1个回答
0
投票

取决于这跨越了多少年,或者您希望这几年后的恢复能力如何

year_bounds
可能最好是动态构建或使用 Snowflake 市场中的现有日历。

基本原理 - 获取包含日历年边界日期的日历查找表。然后摆弄最小/最大以获得基于跨度的天数差异。有一种观点认为,这里更明确地使用 CASE/WHEN 会更好,因此很清楚为什么这一切都有效。

WITH 
some_sample_data(name, start_date, end_date) AS ( 
    SELECT * FROM VALUES 
        ('test1', '2023-12-01'::date, '2024-01-15'::date),
        ('test2', '2023-12-01'::date, '2023-12-17'::date),
        ('test3', '2022-06-01'::date, '2024-01-03'::date)
),
year_bounds(i_year, d_fdoy, d_ldoy) as (
 SELECT column1 as i_year,
        DATE_FROM_PARTS(column1, 1, 1) as d_fdoy,
        DATE_FROM_PARTS(column1, 12, 31) as d_ldoy
   FROM VALUES (2024),(2023),(2022),(2021)
)
select *,
       least(
         datediff(day, greatest(yb.d_fdoy, ssd.start_date), least(ssd.end_date, yb.d_ldoy)),
         datediff(day, ssd.start_date, least(ssd.end_date, yb.d_ldoy))) + 1 as num_days_in_year
  from some_sample_data ssd
  left
  join year_bounds yb
    on yb.i_year between year(ssd.start_date) and year(ssd.end_date)
 order
    by ssd.name,
       yb.i_year;
© www.soinside.com 2019 - 2024. All rights reserved.