Я пытаюсь вычислить рабочую смену из следующих значений, сравнивая значение datetime :: float с 1/3 следующим образом:
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
Почему 16:00:00 отличается от других значений?Что я могу сделать, чтобы правильно обойти эту ошибку (не сравнивая даты с лотом case when
с)?