use*_*632 2 sql-server sql-server-2014 date-math
我有下表,其中包含以下数据:
DECLARE @MyActions TABLE (ActionId INT NOT NULL, ActionDate DATETIME NOT NULL)
INSERT INTO @MyActions VALUES (1, '2021-08-01 01:00:00')
INSERT INTO @MyActions VALUES (2, '2021-08-02 02:00:00')
INSERT INTO @MyActions VALUES (3, '2021-08-03 03:00:00')
INSERT INTO @MyActions VALUES (4, '2021-08-04 04:00:00')
Run Code Online (Sandbox Code Playgroud)
如何在不使用慢表值函数的情况下将每个 ActionID 分解为 10 个附加记录(当前 ActionID 的日期前 5 天和日期后 5 天)?
ActionID = 1 应该爆炸到 11 个总记录(没有时间),Action 2 应该爆炸到 11 个总记录(没有时间),依此类推
分解结果集
DECLARE @MyActions TABLE (ActionId INT NOT NULL, ActionDate DATETIME NOT NULL)
INSERT INTO @MyActions VALUES (1, '2021-08-01 01:00:00')
INSERT INTO @MyActions VALUES (2, '2021-08-02 02:00:00')
INSERT INTO @MyActions VALUES (3, '2021-08-03 03:00:00')
INSERT INTO @MyActions VALUES (4, '2021-08-04 04:00:00')
Run Code Online (Sandbox Code Playgroud)
将每个源行与 11 个偏移日值中的每一个交叉连接,通过转换为日期来删除时间:
SELECT
MA.ActionId,
ActionDate =
CONVERT(datetime,
CONVERT(date,
DATEADD(DAY, Offset.d, MA.ActionDate)))
FROM @MyActions AS MA
CROSS JOIN
(
VALUES
(-5), (-4), (-3), (-2), (-1), (0),
(+1), (+2), (+3), (+4), (+5)
) AS Offset (d);
Run Code Online (Sandbox Code Playgroud)