Tsql 如何在datetime中支持bigint

Tsql 如何在datetime中支持bigint,tsql,Tsql,datediff(ss,'01/01/1970','12/31/2050')的结果是一个bigint,因此datediff溢出 如果SQL中的最大日期为int,如何从bigint值获取其等效日期并再次返回 我需要能够在SQL中存储01/01/1970和12/31/2050之间的秒数(作为char),但将该值转换为日历日期,以便在网页中显示 任何想法都将不胜感激 谢谢大家! 您可以将日期时间转换为浮点数,其中日期时间将表示1900-01-01 00:00:00之后的天数。少于天的部分就是分数。在一

datediff(ss,'01/01/1970','12/31/2050')
的结果是一个
bigint
,因此
datediff
溢出

如果SQL中的最大日期为
int
,如何从
bigint
值获取其等效日期并再次返回

我需要能够在SQL中存储
01/01/1970
12/31/2050
之间的秒数(作为
char
),但将该值转换为日历日期,以便在网页中显示

任何想法都将不胜感激


谢谢大家!

您可以将日期时间转换为浮点数,其中日期时间将表示1900-01-01 00:00:00之后的天数。少于天的部分就是分数。在一天中减去这些数字并按秒进行缩放就可以了

声明@d1 DATETIME

声明@d2日期时间

选择@d1='01/01/1970'

选择@d2='12/31/2050'

选择(铸造(@d2为浮动)-铸造(@d1为浮动))*3600*24


但您可能会找到更好的解决方案;)

这将为您提供毫秒。容易适应秒

declare @dfrom datetime = '1970-01-01 16:15:33.021'
declare @dto datetime = '2058-01-01 15:00:55.557'

declare @diff bigint = 
    cast(DATEDIFF(d, @dfrom, @dto) as bigint) * 24 * 3600 * 1000 
     + DATEDIFF(ms, cast(@dfrom as time), cast(@dto as time))    

declare @dreverse datetime = 
    dateadd(ms, @diff % (1000 * 3600 * 24), 
        dateadd(day, @diff / (1000 * 3600 * 24), @dfrom))   

select @dfrom as [From], @dto as [To], @diff as [Diff], @dreverse as [Reverse] for xml path('')
给出:

<From>1970-01-01T16:15:33.020</From>
<To>2058-01-01T15:00:55.557</To>
<Diff>2777064322537</Diff>
<Reverse>2058-01-01T15:00:55.557</Reverse>
1970-01-01T16:15:33.020
2058-01-01T15:00:55.557
2777064322537
2058-01-01T15:00:55.557

所有linux/Unix都有此问题。众所周知,如果不从32位更改if,这不是一个好主意,除非您乐于忽略第一天和最后一天的小时和秒。Datediff计算“边界”。如果选择datediff(d,'2013-01-01 04:00:00','2013-01-02 10:00:00'),那么结果是1(天),而不是1.25天,因为返回类型是整数。达沃斯,这就是为什么第二行有ms部分?嗯,我错过了,但是如果在你将From时间转换为TO时间之后,你的From时间可能会在TO时间之后,那么你会添加负毫秒,这仍然是一个问题。如果是否定性的测试来证明你的观点,可能会从一整天的毫秒数中减去?declare$dfrom datetime='2014-01-01 16:15:33.021'declare$dto datetime='2014-01-02 15:00:55.557'选择DATEDIFF(ms,cast($dfrom as time),cast($dto as time)),这会给出一个负数(请将$改为“at”符号。不能在注释中使用)
<From>1970-01-01T16:15:33.020</From>
<To>2058-01-01T15:00:55.557</To>
<Diff>2777064322537</Diff>
<Reverse>2058-01-01T15:00:55.557</Reverse>