将列作为参数传递给 SQL 服务器中的 dateadd

Pass a column as parameter to dateadd in SQL Server

我想将 UTC 时间列转换为本地时间。

我的数据是这样的:

time_utc                TZID            timezone
------------------------------------------------
2014-02-27 12:00:39.0   America/Toronto     -5
2013-05-21 09:35:30.0   America/Goose_Bay   -4
2015-01-08 06:58:58.0   America/Creston     -7

我知道使用

select *, DATEADD(hour, 5,time_utc)
from mytable

将为第 time_utc 列增加 5 小时。

但是,如您所见,我有一个可变时区列。

如何将此变量传递给 dateadd 函数?

我尝试了以下 2 个命令,但它们不起作用:

尝试 #1:

select *, DATEADD(hour, timezone, time_utc)
from mytable

尝试 #2:

select *, DATEADD(hour, (select timezone from mytable), time_utc)
from mytable

两者都抛出此错误:

Argument data type varchar is invalid for argument 2 of dateadd function. [SQL State=S0001, DB Errorcode=8116]

对于时区的十进制值,例如 -3.5,这将如何工作?

谢谢

How can I pass this variable to datetime function?

只需引用函数调用中的列:

select *, DATEADD(hour, timezone, time_utc)
from mytable

For decimal values of timezone, for instance -3.5, how would this work?

DATEADD 的 "number" 参数采用整数,因此您必须更改为分钟并缩放小时偏移量。由于您的 timezone 列显然是一个 varchar 列,因此也将其转换为十进制值:

select *, DATEADD(minute, cast(timezone as decimal(4,2)) * 60 , time_utc)
from mytable

您的数据集中有一个字符值(很可能是空白)。 Sql 进行隐式转换,但对于非数值,它将失败。检查您的 table 以查看时区

是否有空白或非数值