【问题标题】:Converting epoch seconds column to date time in SQL Server在 SQL Server 中将纪元秒列转换为日期时间
【发布时间】:2020-05-20 17:33:20
【问题描述】:

我有一列包含纪元秒数(数据类型为varchar),我需要将其转换为日期时间格式。我在使用 dateadd() 函数时遇到问题。

UPDATE A
SET A.departure = DATEADD(s, departure, '1970-01-01 00:00:00')
FROM TABLE A

我收到此错误:

参数数据类型 varchar 对于 dateadd 函数的参数 2 无效

两个问题:

  1. 我是否正确使用了dateadd() 函数?
  2. 我应该将列数据类型转换为什么才能使其工作?我尝试转换为int,但没有成功

【问题讨论】:

  • 包括您要转换的列的示例值,以及您尝试转换到的正确日期时间。
  • 没有样本数据,很难知道“出发”是什么......它是真正的以毫秒为单位的EPOCH吗?看看stackoverflow.com/questions/55248494/…
  • DATEADD(s, leave, cast('1970-01-01 00:00:00' as datetime))
  • “参数数据类型 varchar 对 dateadd 函数的参数 2 无效” 这个错误再清楚不过了。 departure 显然是 varchar。您不能将varchar“添加”到日期。第二个参数多为数值数据类型。如果departure 仅包含数字数据类型,您需要 修复您的设计。如果不只包含数值,那么'abc' 秒是多少秒?

标签: sql-server epoch dateadd


【解决方案1】:

这是你需要的吗?

不幸的是,您的纪元时间似乎存储为字符串值。使用TRY_CAST 将允许您将可以从字符串转换的值转换为可以使用DATEADD 添加的整数。

如果您可以选择,最好将转换后的值存储在具有正确 DATEDATETIME 数据类型的新列中,这样您就不会发现自己再次与字符串搏斗未来。

UPDATE A
SET A.departure = DATEADD(SECOND, TRY_CAST(departure AS bigint), '1970-01-01 00:00:00')
FROM TABLE A

实际上,在输入之后,更新原始列根本不是一个好主意。对于无法转换departure 的值,该函数将返回NULL,您将丢失数据。您需要在此处进行一些验证以避免出现问题。

至少:

SELECT 
 *
FROM TABLE 
WHERE TRY_CAST(departure AS bigint) IS NULL;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2021-05-26
    • 2015-07-13
    • 2020-09-14
    • 2018-11-26
    • 2018-04-24
    • 2011-12-06
    相关资源
    最近更新 更多