将列作为参数传递给 SQL Server 中的 dateadd
Posted
技术标签:
【中文标题】将列作为参数传递给 SQL Server 中的 dateadd【英文标题】:Pass a column as parameter to dateadd in SQL Server 【发布时间】:2016-04-16 09:22:21 【问题描述】:我想将一列 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
两者都抛出这个错误:
参数数据类型 varchar 对于 dateadd 函数的参数 2 无效。 [SQL 状态=S0001,数据库错误代码=8116]
对于时区的十进制值,例如 -3.5,这将如何工作?
谢谢
【问题讨论】:
考虑将timezone
的数据类型更改为varchar
。
【参考方案1】:
您的数据集中有一个字符值(很可能是空白)。 Sql 会进行隐式转换,但对于非数值它会失败。检查您的表格,看看您的时区是否有空白或非数字值
【讨论】:
【参考方案2】:如何将此变量传递给 datetime 函数?
只需引用函数调用中的列:
select *, DATEADD(hour, timezone, time_utc)
from mytable
对于时区的十进制值,例如 -3.5,这将如何工作?
DATEADD
的“数字”参数采用整数,因此您必须更改为分钟并缩放小时偏移量。由于您的 timezone
列显然是一个 varchar 列,因此也将其转换为十进制值:
select *, DATEADD(minute, cast(timezone as decimal(4,2)) * 60 , time_utc)
from mytable
【讨论】:
我先尝试了这个。它给了我以下错误:参数数据类型 varchar 对于 dateadd 函数的参数 2 无效。 [SQL 状态=S0001,数据库错误代码=8116]@d_stanley @AsiehHarati 这是需要了解的重要信息。我添加了一项可用于将文本转换为数字数据的函数。 谢谢 D 斯坦利。是的,这行得通!就一个问题。据我了解,最大的时区差异是 30 分钟(0.5),因此时区范围从 -12.0 到 12.0,只有一位十进制数字(0 或 5)。在这种情况下,我们可以将 decimal(4,2) 更改为 decimal(3,1),因为当乘以 60 时,它将是一个自然而不是十进制数。 @AsiehHarati 当然 - 如果您的数据都没有超过一位十进制数字,它不会有任何真正的区别。DATEADD
无论如何都会将其截断为整数。以上是关于将列作为参数传递给 SQL Server 中的 dateadd的主要内容,如果未能解决你的问题,请参考以下文章
将 Access 表日期值作为参数传递给 SQL Server 存储过程
在 ASP.Net Core 项目中使用 ADO.Net 将 JSON 类型作为参数传递给 SQL Server 2016 存储过程