处理 SQL 通过时区加入

Handling SQL join via timezone

我需要连接两个表。连接必须使用参数@timezone 来处理。 但有一个问题 - @timezone 的值可以是 null、''、' ' 或其他任何值。用户可以输入所有内容。

如果@timezone 的值为空,则连接的结果基本上为零。 因此,如果发生这种情况,必须至少有基本价值才能加入(例如,'Pacific Standard Time')

DECLARE @StartDate DATE = '2022-01-20', @EndDate DATE = '2022-01-30', @t1 INT = 12345, @timezone VARCHAR(max) = NULL, @OnlyActivated INT = 0
SELECT r.ChargeType, r.CustomerName, r.PurchaseDate, r.accountID
FROM table_report as r
LEFT JOIN [sys].[time_zone_info] tzi ON tzi.[name] = @timezone (???)

我尝试了 IIF(@timezone IN (NULL,'',' '),'Pacific Standard Time',@timezone),它适用于“”和“”场景,但后来我意识到无法比较 null。

也许有一个非常明显的解决方案,但我没有看到。

希望你能帮忙。

P.S。 CURRENT_TIMEZONE_ID() 不受支持。

您需要 left-join 两次才能执行此操作。第二次加入需要有一个条件,即只有在第一次加入不成功时才执行。

DECLARE
    @StartDate DATE = '2022-01-20',
    @EndDate DATE = '2022-01-30',
    @t1 INT = 12345,
    @timezone VARCHAR(max) = NULL,
    @OnlyActivated INT = 0;

SELECT
  r.ChargeType, r.CustomerName, r.PurchaseDate, r.accountID,
  ISNULL(tzi1.SomeValue, tzi2.SomeValue)
FROM table_report as r
LEFT JOIN [sys].[time_zone_info] tzi1 ON tzi1.[name] = @timezone
LEFT JOIN [sys].[time_zone_info] tzi2 ON tzi2.[name] = 'Pacific Standard Time'
    AND tzi1.[name] IS NOT NULL;

另一种选择,如果您只担心 NULL 就是 ISNULL 变量

DECLARE
    @StartDate DATE = '2022-01-20',
    @EndDate DATE = '2022-01-30',
    @t1 INT = 12345,
    @timezone VARCHAR(max) = NULL,
    @OnlyActivated INT = 0;

SELECT
  r.ChargeType, r.CustomerName, r.PurchaseDate, r.accountID,
  tzi.SomeValue
FROM table_report as r
LEFT JOIN [sys].[time_zone_info] tz1 ON tzi.[name] = ISNULL(@timezone, 'Pacific Standard Time');