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>