【发布时间】:2020-05-22 10:03:03
【问题描述】:
我的日期存储在一个浮点列中,我试图将其更改为时间戳,但没有成功,
现在我想从那个字段计算年龄,我已经尝试了使用CONVERT 和CAST 函数的各种组合,但它似乎不起作用。
DoB
-434419200000
606960000000
1332806400000
1395878400000
-87350400000
890956800000
我试过了:
SELECT DATEADD(ss, dob, '19700101')
from tbl
//Result
Error overflow .. arithmetique for type int, value= -434419200000.000000
SELECT DATEADD(ss, CONVERT(bigint, dob, 101), '19700101')
from tbl
//Result
Error while conversion from expression to type int.
更新
注意这里的数据是从日期“1970/1/1 00:00:00”开始的毫秒数
谢谢。
【问题讨论】:
-
-434419200000代表什么“日期”..?您在它上面所做的所有代码都从float值-434419200000转换为varchar(未指定长度)。它不做任何年龄计算。 -
以时间戳表示出生日期,但该列是float类型,在我获取数据作为日期后,年龄计算是进一步的步骤。
-
您必须弄清楚谁或什么在存储这些值以及它们的含义。这种时间戳方法不是 SQL Server 原生的。您不能使用任何内置类型从日期中获取负数。例如,
-434419200000可能是从 1970-01-01 开始的 Unix 日期/时间值(以毫秒为单位),因此它代表的 DOB 为 1956-03-27,但这纯粹是推测,没有看到实际处理值。如果它是 Unix 时间戳,请参阅here。 -
-434419200000对于 int 来说太小了,您需要使用bigint。 -
问题不在于
float,而在于DATEADD不支持除INT之外的任何东西并且没有DATEADD_BIG。SELECT DATEADD(SECOND, CONVERT(BIGINT, -434419200000) / 1000, '19700101').
标签: sql-server tsql date timestamp