算术溢出转换 LDAP lastLogon

Arithmetic overflow casting LDAP lastLogon

我正在尝试使用以下代码将 LDAP lastLogon 值转换为 SQL DateTime 值:

DATEADD(MS, CAST(lastLogon AS BIGINT), '19700101')

其中 lastLogin 是用户最近登录的 AD 值。 我收到此错误:

Arithmetic overflow error converting expression to data type int.

我正在检查 null 并使用 ISNUMERIC。 我们是 运行 2008 R2。有什么想法吗?

您的 lastLogon 值太大,DATEADD() 接受 INT 值而不是 BIGINT

您可以通过多个步骤来解决此问题,将您的时间分成更大单位的更小块,即首先是秒,然后是毫秒:

DATEADD(MS,CAST(lastLogon AS BIGINT)%1000,DATEADD(SECOND, CAST(lastLogon AS BIGINT)/1000, '19700101'))

我认为 Week 是您迈出第一步的最大限度,因为一个月的毫秒数不适合 INT,但我可能会坚持使用 DAY 为简单起见:

DATEADD(MS,CAST(lastLogon AS BIGINT)%(1000*60*60*24),DATEADD(DAY, CAST(lastLogon AS BIGINT)/(1000*60*60*24), '19700101'))

来不及了。但找到了解决方案 样本:

select  dateadd(day,130787731801583080 / (60 * 10000000) / 1440  - (datediff(dd, '1/1/1900', dateadd(yy, 299, '1/1/1900'))), '1/1/1900')