我们如何让 GENERATE_SERIES 为 Synapse 工作? 如果您尝试运行查询 SELECT * FROM GENERATE_SERIES(1,10,1) 作为一个简单的示例,我们会收到错误:
“对象名称‘generate_series’无效”
此外,我们也无法在 Synapse 中使用 CTE: “此版本的 Synapse SQL 不支持递归 CTE。”
这适用于 SQL Server 开发(本地)
DECLARE @StartOfYear datetime = DATEADD(MINUTE, -1, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0));
SELECT DATEADD(MINUTE, [value], @StartOfYear) AS [DATE_TIME]
FROM
GENERATE_SERIES(1,
DATEDIFF(MINUTE, @StartOfYear,
DATEFROMPARTS(YEAR(GETDATE())+1,1,1)
)
)
消息 8768,第 16 级,状态 1,第 5 行 此版本的 Synapse SQL 不支持递归 CTE。
GENERATE_SERIES
函数和递归 CTE。要获得相同的结果,您可以在 synapse sql 中使用 WHILE 循环。
代码:
DECLARE @StartOfYear datetime = DATEADD(MINUTE, -1, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0));
DECLARE @EndOfYear datetime = DATEFROMPARTS(YEAR(GETDATE())+1,1,1);
DECLARE @Counter int = 1;
CREATE TABLE #TempTable ([DATE_TIME] datetime);
WHILE DATEADD(MINUTE, @Counter, @StartOfYear) < @EndOfYear
BEGIN
INSERT INTO #TempTable ([DATE_TIME])
SELECT DATEADD(MINUTE, @Counter, @StartOfYear);
SET @Counter = @Counter + 1;
END;
SELECT [DATE_TIME] FROM #TempTable;
这将创建一个名为 #TempTable 的临时表,将 WHILE 循环生成的日期时间值插入到表中,然后从表中选择所有行。
此代码使用 synapse sql 中的 start date='2023-01-01 23:50:00.000' 和 end date = '2023-01-02' 的样本值进行测试;生成日期值如下图所示。