我们如何使用 Azure Synapse 中的Generate_Series 或 CTE 创建日期范围

问题描述 投票:0回答:1

我们如何让 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。

azure common-table-expression azure-synapse
1个回答
0
投票
Azure Synapse Analytics 不支持

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' 的样本值进行测试;生成日期值如下图所示。

img1

© www.soinside.com 2019 - 2024. All rights reserved.