Hello, All!
Требуется произвольное значение типа datetime округлить до дня, часа, 10 минут, минуты, отбросив остаток. Например
для значения
01.01.2001 10:11:10.100
округление до дня: 01.01.2001 00:00:00.000
округление до часа: 01.01.2001 10:00:00.000
округление до 10 минут: 01.01.2001 10:10:00.000
округление до минуты: 01.01.2001 10:11:00.000
Понятно, что тип datetime хранится как 8-и байтовый float, где целая часть — это количество дней с 1900 года. Но вот, что меня смущает:
SET DATEFORMAT DMY
DECLARE @d DATETIME
SET @d = '01.01.2001 10:10:00.000'
SELECT @d, CAST(CAST(@d AS FLOAT) AS DATETIME)
Результат:
+-------------------------+--------------------------+
| 2001-01-01 10:10:00.000 | 2001-01-01 10:09:59.997 |
+-------------------------+--------------------------+
1. Чего я неправильно понимаю? Ведь каст между одним и тем же типом не должен приводить к смене значения?
2. Как все же сделать окургление наиболее правильно, при условии, что функция будет использоваться достаточно интенсивно и в больших запросах, и конвертация в символьное представление мне как-то не особо нравится.