将datetime转换为float时,SQL的转换函数如何工作?

Jee*_*att 12 sql t-sql sql-server

为什么输出这个查询:

declare @currentDate as datetime
    set @currentDate ='01/07/2010'

select convert(float, @currentdate) 
Run Code Online (Sandbox Code Playgroud)

......是40183?

所以对于那些对我的问题感到困惑的人,我的问题是如何在不执行的情况下知道上述查询的结果?

jac*_*ate 12

DateTime通常表示为整数部分上预定日期(通常称为纪元)的日计数和自小夜部分中午夜以来经过的日期百分比.

SQL Server不是例外,因此转换为Float很有意义.第0天是1900年1月1日00:00 00:00:00(AFAIK,在没有特定的时区,因此您应该将其视为"当地时间").

所以,你可以试试这个:

declare @ADate DateTime;
set @ADate = '19000101 00:00:00';
select CONVERT(float, @ADate);  --should print 0
set @ADate = '19000101 12:00:00';
select CONVERT(float, @ADate);  --should print 0.5
set @ADate = '19001231 06:00:00';
select CONVERT(float, @ADate);  --should print 364.25
Run Code Online (Sandbox Code Playgroud)

因此,对于您的结果,自01/01/1900 00:00:00和01/07/2010 00:00:00以来已过去40183天

澄清:类似Unix的系统使用不同的方法来存储日期时间:自Unix纪元(1970年1月1日00:00:00 UTC)以来的秒数,更常见的是纪元时间.

[编辑]此响应的日期格式在20140416更改为YYYYMMDD格式,经过一些新的SQL Server使用经验(以及@Damien在评论中说),这是唯一安全的格式.


Tho*_*mas 5

DateTime 值实际上存储为两个四字节整数。第一个四字节整数表示自 1900-01-01 以来的天数。第二个四字节整数存储自午夜以来的毫秒数。将日期时间转换为浮点数时,小数部分表示过去 24 天的百分比。因此,0.5 代表中午。