将列从 BigInt 转换为 DateTime

时间:2021-02-06 00:49:26

标签: sql sql-server datetime type-conversion bigint

我知道这里有人问过这个问题,但我试过的例子却为我抛出了错误。

我有一个从 AD 中提取用户数据的表。有一栏是密码过期时间和密码上次设置时间。我检查了这一列的数据类型,它是 BigInt。我正在尝试将其转换为实际的日期时间。这就是我正在运行的。

select 
us.resourceid,
us.user_Name0,
us.displayName0,
us.department0,
us.msDS_UserPasswordExpiryTi,
us.pwdLastSet,
us.Windows_NT_Domain0
from v_R_User us 
Where (us.User_Name0 not like '%$' and us.User_Name0 not like 'HealthMailbox%' and us.User_Name0 not like 'svc%')

这是返回数据的示例

resourceid  user_Name0  displayName0    department0 msDS_UserPasswordExpiryTi   pwdLastSet Windows_NT_Domain0
2063597569  ZZZZZ       Name0           NULL        131113622747354070          130798262747354070  Dom1
2063597572  CCCCC       Name1           Dept1       132781804234873444          132466444234873444  Dom1
2063597573  FFFFF       Name2           Dept1       132829224102270283          132513864102270283  Dom1
2063597574  FFFFFE      Name3           Dept1       132737776092485812          132422416092485812  Dom1
2063597575  YYYYYY      Name4           Dept2       132781839502628544          132466479502628544  Dom2
2063597576  VVVVVV      Name5           Dept3       132798423957001686          132483063957001686  Dom2
2063597577  GGGGG       Name6           Dept3       132750906648479589          132435546648479589  Dom2

我尝试使用以下几行运行查询以创建另一列,并将数据转换为日期时间,但始终收到错误 Arithmetic overflow error converting expression to data type int.

dateadd(s, convert(bigint, us.msDS_UserPasswordExpiryTi) / 10000, convert(datetime, '1-1-1970 00:00:00')) 
dateadd(ms, us.msDS_UserPasswordExpiryTi / 86400000, (us.msDS_UserPasswordExpiryTi / 86400000) + 25567)
Cast(Dateadd(second, Cast(us.msDS_UserPasswordExpiryTi AS BIGINT) / 1000, '19700101') AS DATE) 
cast(cast(us.msDS_UserPasswordExpiryTi as varchar(80)) as datetime)

我不确定是数据问题还是什么。如果您只是将其中一个值复制出来并使用上述任何行仅使用该值运行 select 语句,我会得到相同的错误。等

Select dateadd(s, convert(bigint, 131113622747354070) / 10000, convert(datetime, '1-1-1970 00:00:00'))

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您的时间戳似乎以一亿秒为单位——相当精确。

您可以将其分为两种计算方式,一种用于日期,另一种用于日期部分。如果精确到一秒就足够了(正如您的问题所暗示的那样),那么:

ube16_t