我正在尝试编写一个查询来从多个截至日期的存档表中返回数据。我知道如何返回单个时间点的数据:
declare @Date date = '2023-09-01';
declare @DateTime DATETIME = concat(@Date,' 10:30:00.000');
select
@Date,
[Item],
[Quantity]
from
Fruit for SYSTEM_TIME as of @DateTime;
我在自己的
FirstDateMonth
表中有该月的第一天,如下所示:
日期 | 日期时间UTC |
---|---|
2023-01-01 | 2023-01-01 10:30:00.000 |
2023-02-01 | 2023-02-01 10:30:00.000 |
2023-03-01 | 2023-03-01 10:30:00.000 |
2023-04-01 | 2023-04-01 10:30:00.000 |
2023-05-01 | 2023-05-01 10:30:00.000 |
2023-06-01 | 2023-06-01 10:30:00.000 |
2023-07-01 | 2023-07-01 10:30:00.000 |
2023-08-01 | 2023-08-01 10:30:00.000 |
2023-09-01 | 2023-09-01 10:30:00.000 |
我想编写一个与上面类似的查询,但它会循环遍历
FirstDateMonth
表上的每个日期并返回与此类似的结果:
日期 | 项目 | 数量 |
---|---|---|
2023-01-01 | 苹果 | 2 |
2023-01-01 | 香蕉 | 4 |
2023-02-01 | 苹果 | 2 |
2023-02-01 | 香蕉 | 5 |
2023-03-01 | 苹果 | 3 |
2023-03-01 | 香蕉 | 1 |
2023-04-01 | 苹果 | 8 |
2023-04-01 | 香蕉 | 1 |
2023-05-01 | 苹果 | 4 |
2023-05-01 | 香蕉 | 3 |
等等... |
关于如何实现这一点有什么建议吗?
这是凭记忆,因为我目前没有任何东西可以测试..
基本原理是创建一个表值函数,返回单点 int 时间的数据,并将其交叉应用于月初日期。
有点像
CREATE FUNCTION getFruitAsOf (@AsOdDate datetime)
RETURNS TABLE
AS
(SELECT * FROM dbo.Fruit FRO SYSTEM_TIME AS OF @AsOfDate)
然后将其交叉应用到您的日期表中
SELECT
d.StartDateTime,
f.*
FROM myDatesTable d
CROSS APPLY getFruitAsOf(d.StartDateTime) f