首页 > 解决方案 > 查找日期范围内某个日期的所有实例 - SQL Server

问题描述

我需要在日期范围内查找每个财政年度结束日期的商品价格。在这种情况下,财政年度是例如 3 月 31 日

我的表例如:

物品编号 价值 日期从 日期至
1 10 '2019/01/01' '2021/02/28'
1 11 '2021/03/01' '2021/05/01'

SQL小提琴

因此,SQL 将导致上表为:

物品编号 价值 日期从 日期至
1 10 '2019/01/01' '2019/03/30'
1 10 '2020/03/31' '2021/02/28'
1 11 '2020/03/01' '2021/03/30'
1 11 '2020/03/31' '2021/05/01'

标签: datesql-server-2017

解决方案


接受的答案是不正确的,因为它没有拆分一年中具有不同values 的不同部分。

你也不需要一张Year桌子,尽管它可能是有益的。您可以使用VALUES表格即时生成它。

还要注意检查间隔重叠的更好方法,使用ANDnotOR

WITH Years AS (
    SELECT
        YearStart = DATEFROMPARTS(v.yr, 3, 31),
        YearEnd = DATEFROMPARTS(v.yr + 1, 3, 31)
    FROM (VALUES
      (2015),(2016),(2017),(2018),(2019),(2020),(2021),(2022),(2023),(2024),(2025),(2026),(2027),(2028),(2029),(2030),(2031),(2032),(2033),(2034),(2035),(2036),(2037),(2038),(2039)
    ) v(yr)
)
SELECT
    i.ItemID,
    i.Value,
    DateFrom = CASE WHEN i.DateFrom > y.YearStart THEN i.DateFrom ELSE y.YearStart END,
    DateTo =   CASE WHEN i.DateTo > y.YearEnd THEN y.YearEnd ELSE i.DateTo END
FROM items i
JOIN Years y ON i.DateFrom <= y.YearEnd
             AND i.DateTo >= y.YearStart;

推荐阅读