Tsql sql server日期时间浮动错误

Tsql sql server日期时间浮动错误,tsql,sql-server-2012,rounding-error,Tsql,Sql Server 2012,Rounding Error,我试图通过将datetime::float值与1/3进行比较,从as FLOWS计算工作班次,如下所示: select t, cast( ( cast( cast(t as datetime) as float) - floor(cast( cast(t as datetime) as float ) ) ) * 3.0 as decimal(38,30) ) x, floor( ( cast( cast(t as datetime) as float) -

我试图通过将datetime::float值与1/3进行比较,从as FLOWS计算工作班次,如下所示:

select t, 
    cast( ( cast( cast(t as datetime) as float) - floor(cast( cast(t as datetime)  as float ) ) ) * 3.0 as decimal(38,30) ) x,
    floor( 
        ( cast( cast(t as datetime) as float) - floor(cast( cast(t as datetime)  as float ) ) ) * 3.0 
        ) x1
from ( values ('2019-01-01 00:00:00.0') , ('2019-01-01 07:59:59.0') , 
              ('2019-01-01 08:00:00.0') , ('2019-01-01 15:59:59.0') , 
              ('2019-01-01 16:00:00.0') , ('2019-01-01 23:59:59.0') ) test_sample(t)
但结果令人困惑:

2019-01-01 00:00:00.0   0E-30   0.0
2019-01-01 07:59:59.0   0.999965277776937010000000000000    0.0
2019-01-01 08:00:00.0   1.000000000007276000000000000000    1.0
2019-01-01 15:59:59.0   1.999965277784212900000000000000    1.0
2019-01-01 16:00:00.0   1.999999999992724100000000000000    1.0 <----- inconsistency, expected 2.0
2019-01-01 23:59:59.0   2.999965277769661100000000000000    2.0
2019-01-01 00:00:00.0 0E-30 0.0
2019-01-01 07:59:59.0   0.999965277776937010000000000000    0.0
2019-01-01 08:00:00.0   1.000000000007276000000000000000    1.0
2019-01-01 15:59:59.0   1.999965277784212900000000000000    1.0

2019-01-01 16:00:00.0 1.99999992724100000000000000 1.0我不明白你为什么要做这么复杂的一系列演员。我们应该先解决这个问题。但您的答案可能与浮点运算有关,这在SQL Server(或其他语言)中并不精确。无论您试图实现什么,只需使用精确的数据类型:。Float/real/double是近似的数据类型。@Tim Biegeleisen:我需要将24小时分为几个班次,而不是在一次就能得到班次代码时使用许多
案例。老实说,这个想法来源于我以前使用epochtimes的
postgresql
。我想我可以对datetime::float in
mssql
@lad2025做同样的处理:恐怕它们仍然不一致,看看那些尖锐的时钟。如果我对它们进行
floor
处理,我会得到不同的结果…:-(请参见,关于浮点和数字之间的差异。)