微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查找日期范围内的所有日期实例 - SQL Server

如何解决查找日期范围内的所有日期实例 - SQL Server

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

例如我的表:

ItemID 价值 日期从 日期到
1 10 '2019/01/01' '2021/02/28'
1 11 '2021/03/01' '2021/05/01'

SQL Fiddle

sql 将导致上表为:

ItemID 价值 日期从 日期到
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'

解决方法

您可以解决它,但先决条件是创建一个名为 financial_yearstable 并用数据填充它。这将是表的结构:

financial_years(id,DateFrom,DateTo)

现在你有了这张表,你可以做这样的事情:

select ItemID,Value,financial_years.DateFrom,financial_years.DateTo
from items
join financial_years
on (items.DateFrom between financial_years.DateFrom and financial_years.DateTo) or
   (items.DateTo between financial_years.DateFrom and financial_years.DateTo)
order by financial_years.DateFrom;
,

接受的答案不正确,因为它没有将一年中具有不同 value 的不同部分分开。

您也不需要Year 表,尽管它可能是有益的。您可以使用 VALUES 表动态生成它。

注意还有一个更好的方法来检查间隔重叠,使用 AND 而不是 OR

WITH Years AS (
    SELECT
        YearStart = DATEFROMPARTS(v.yr,3,31),YearEnd = DATEFROMPARTS(v.yr + 1,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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。