将列作为参数传递给 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的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将列作为参数传递给 ORDER BY 子句?

将 Access 表日期值作为参数传递给 SQL Server 存储过程

将参数传递给 SQL Server 中的视图

在 ASP.Net Core 项目中使用 ADO.Net 将 JSON 类型作为参数传递给 SQL Server 2016 存储过程

拆分逗号分隔参数传递给SQL Server 2008 R2中的存储过程

使用引号将参数传递给 SQL Server SP