【问题标题】:SQL Server to SYnapse SQL syntax modificationsSQL Server 到 SYnapse SQL 语法修改
【发布时间】:2022-11-04 18:58:24
【问题描述】:

我有一个在 SQL Server 中工作得很好的查询,但我需要一些帮助来进行所需的语法修改,以使其在 Synapse SQL 中工作。任何帮助,将不胜感激! id 是 unix 时间戳。我想使用unix时间戳按时间范围计算前一天过滤的id

SELECT COUNT(Id)
FROM [dbo].[name]
WHERE Id >= CONVERT(bigint, DATEDIFF(SECOND,'1970-01-01', CONVERT(date,dateadd(d, -1, GETDATE()))))*1000 
          and Id < CONVERT(bigint, DATEDIFF(SECOND,'1970-01-01', CONVERT(date,GETDATE())))*1000

【问题讨论】:

  • 如果它不能在 Azure Synapse 上运行,如果你解释它为什么不能运行会很有帮助。
  • 我不知道为什么它不起作用。它产生一个空列,没有错误
  • 您可能想要检查您从表达式中获得的值(例如CONVERT(bigint, DATEDIFF(SECOND,'1970-01-01', CONVERT(date,dateadd(d, -1, GETDATE()))))*1000)。可能返回的值不是您所期望的。例如,Azure 服务(通常)以 UTC 运行,因此 GETDATE() 可能会提供与您在本地获得的完全不同的价值。如果您的 epoch 的值不是基于 UTC 的,那么您的查询不会给您返回您期望的结果。
  • 你能分享样本输入ID吗?
  • 当然,一个 id 的例子是:1622079015031

标签: sql sql-server azure-synapse


【解决方案1】:

当 SQL Server 和 Azure Synapse 处于不同的时区时,Query 的结果会有所不同。 Azure Synapse 将采用 UTC 时区。

为了将当前日期值转换为 azure synapse 中的本地日期时间值,用户定义函数创建如下脚本。

Create  FUNCTION [dbo].[CurrentLocalTime]( @TimeZoneName sysname )
RETURNS datetime
AS
BEGIN
RETURN DATEADD(hour, 
                 TRY_CAST((SELECT REPLACE(current_utc_offset, N':', N'.')
                           FROM sys.time_zone_info
                           WHERE [name] = @TimeZoneName) AS decimal(18,2)), 
                 SYSDATETIME());
END;

在查询中使用上述函数,而不是使用函数的 getdate()。

询问

SELECT COUNT(Id) FROM sample1
WHERE Id >= CONVERT(bigint, DATEDIFF(SECOND,'1970-01-01', CONVERT(date,dateadd(d, -1, dbo.CurrentLocalTime('AUS Eastern Standard Time' )))))*1000 
and Id < CONVERT(bigint, DATEDIFF(SECOND,'1970-01-01', CONVERT(date,dbo.CurrentLocalTime('AUS Eastern Standard Time' ))))*1000

可以根据需要在查询中替换时区。

结果对于样本数据:

【讨论】:

    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 2015-09-30
    • 2014-01-23
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2020-03-04
    相关资源
    最近更新 更多