Должен признать, что раньше я не видел конвертацию в пол-поплавок, показанную Мэттом. Я должен был проверить это.
Я проверил чистый выбор (который будет возвращать дату и время, а не то, что нам нужно), правящее решение здесь (floor-float), общее «наивное», упомянутое здесь (stringconvert) и упомянутое здесь что я использовал (как я думал, это было самым быстрым).
Я протестировал запросы на тестовом сервере MS SQL Server 2005, работающем на сервере Win 2003 SP2 с процессором Xeon 3GHz, работающим на максимальной памяти (32 бита, то есть около 3,5 Гб). Ночь, когда я нахожусь так, машина бездельничает почти без нагрузки. Я получил все это для себя.
Вот журнал из моего тестового прогона, выбранный из большой таблицы, содержащей метки времени, варьирующиеся до уровня в миллисекундах. Этот конкретный набор данных включает в себя даты более 2,5 лет. Сама таблица содержит более 130 миллионов строк, поэтому я ограничиваюсь первым миллионом.
SELECT TOP 1000000 CRETS FROM tblMeasureLogv2
SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2
SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2
Время анализа и компиляции SQL Server: время ЦП = 0 мс, прошедшее время = 1 мс.
(затронуто 1000000 строк) Таблица 'tblMeasureLogv2'. Сканирование 1, логическое чтение 4752, физическое чтение 0, чтение с опережением 0, чтение логического объекта 0, чтение с физического объекта 0, чтение с опережением 0.
Время выполнения SQL Server: время ЦП = 422 мс, прошедшее время = 33803 мс.
(затронуто 1000000 строк) Таблица 'tblMeasureLogv2'. Сканирование 1, логическое чтение 4752, физическое чтение 0, чтение с опережением 0, логическое чтение с 0, физическое чтение с 0, чтение с опережением 0.
Время выполнения SQL Server: время ЦП = 625 мс, прошедшее время = 33545 мс.
(затронуто 1000000 строк) Таблица 'tblMeasureLogv2'. Сканирование 1, логическое чтение 4752, физическое чтение 0, чтение с опережением 0, логическое чтение с 0, физическое чтение с 0, чтение с опережением 0.
Время выполнения SQL Server: время ЦП = 1953 мс, прошедшее время = 33843 мс.
(затронуто 1000000 строк) Таблица 'tblMeasureLogv2'. Сканирование 1, логическое чтение 4752, физическое чтение 0, чтение с опережением 0, логическое чтение с 0, физическое чтение с 0, чтение с опережением 0.
Время выполнения SQL Server: время ЦП = 531 мс, прошедшее время = 33440 мс. Время анализа и компиляции SQL Server: время ЦП = 0 мс, прошедшее время = 1 мс.
Время выполнения SQL Server: время ЦП = 0 мс, прошедшее время = 1 мс.
Что мы здесь видим?
Давайте сосредоточимся на времени процессора (мы смотрим на преобразование), и мы увидим, что у нас есть следующие числа:
Pure-Select: 422
Floor-cast: 625
String-conv: 1953
DateAdd: 531
Из этого мне кажется, что DateAdd (по крайней мере, в данном конкретном случае) немного быстрее, чем метод приведения к полу.
Перед тем, как перейти туда, я несколько раз запускал этот тест, с измененным порядком запросов, с одинаковыми результатами.
Это что-то странное на моем сервере или как?