处理 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');
我需要连接两个表。连接必须使用参数@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');