查找日期范围内某个日期的所有实例 - SQL 服务器
Find all instances of a date in a date range - SQL Server
我需要查找日期范围内每个财政年度结束日期的商品价格。在这种情况下,财政年度是例如3 月 31 日
我的table例如:
物品ID
价值
日期
日期到
1
10
'2019/01/01'
'2021/02/28'
1
11
'2021/03/01'
'2021/05/01'
SQL 将导致上述 table 为:
物品ID
价值
日期
日期到
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_years 的 table
并用数据填充它。这将是 table:
的结构
financial_years(id, DateFrom, DateTo)
现在你有了这个 table,你可以这样做:
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
s 的一年中的不同部分。
您也不需要 Year
table,尽管它可能是有益的。您可以使用 VALUES
table.
即时生成它
另请注意检查间隔重叠的更好方法,使用 AND
而不是 OR
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;
我需要查找日期范围内每个财政年度结束日期的商品价格。在这种情况下,财政年度是例如3 月 31 日
我的table例如:
物品ID | 价值 | 日期 | 日期到 |
---|---|---|---|
1 | 10 | '2019/01/01' | '2021/02/28' |
1 | 11 | '2021/03/01' | '2021/05/01' |
SQL 将导致上述 table 为:
物品ID | 价值 | 日期 | 日期到 |
---|---|---|---|
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_years 的 table
并用数据填充它。这将是 table:
financial_years(id, DateFrom, DateTo)
现在你有了这个 table,你可以这样做:
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
s 的一年中的不同部分。
您也不需要 Year
table,尽管它可能是有益的。您可以使用 VALUES
table.
另请注意检查间隔重叠的更好方法,使用 AND
而不是 OR
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;