将列作为参数传递给 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 以查看时区
是否有空白或非数值
我想将 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 以查看时区
是否有空白或非数值