Ответ 1
Я должен признать, что я не видел преобразования с полом, показанного Мэттом раньше. Я должен был проверить это.
Я проверил чистый выбор (который вернет дату и время, и это не то, что мы хотим), действующее решение здесь (floor-float), общее "наивное", упомянутое здесь (stringconvert) и упомянутое здесь что я использовал (как я думал, это был самый быстрый).
Я протестировал запросы на тестовом сервере MS SQL Server 2005, запущенном на сервере Windows 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: время CPU = 0 мс, прошедшее время = 1 мс.
(затронуто 1000000 строк) Таблица 'tblMeasureLogv2'. Число сканирования 1, логическое считывание 4752, физическое считывание 0, чтение вперед 0, логическое считывание логических чисел 0, физическое чтение lob 0, чтение с чтением lob 0.
Время выполнения SQL Server: время процессора = 422 мс, прошедшее время = 33803 мс.
(затронуто 1000000 строк) Таблица 'tblMeasureLogv2'. Число сканирования 1, логическое считывание 4752, физическое считывание 0, чтение вперед 0, логическое считывание логических чисел 0, физическое чтение lob 0, чтение с чтением lob 0.
Время выполнения SQL Server: время процессора = 625 мс, прошедшее время = 33545 мс.
(затронуто 1000000 строк) Таблица 'tblMeasureLogv2'. Число сканирования 1, логическое считывание 4752, физическое считывание 0, чтение вперед 0, логическое считывание логических чисел 0, физическое чтение lob 0, чтение с чтением lob 0.
Время выполнения SQL Server: время процессора = 1953 мс, прошедшее время = 33843 мс.
(затронуто 1000000 строк) Таблица 'tblMeasureLogv2'. Число сканирования 1, логическое считывание 4752, физическое считывание 0, чтение вперед 0, логическое считывание логических чисел 0, физическое чтение lob 0, чтение с чтением lob 0.
Время выполнения SQL Server: время процессора = 531 мс, прошедшее время = 33440 мс. Время и время компиляции SQL Server: время CPU = 0 мс, прошедшее время = 1 мс.
Время выполнения SQL Server: время процессора = 0 мс, прошедшее время = 1 мс.
Что мы здесь видим?
Давайте сосредоточимся на времени процессора (мы смотрим на преобразование), и мы можем видеть, что у нас есть следующие номера:
Pure-Select: 422
Floor-cast: 625
String-conv: 1953
DateAdd: 531
От этого мне кажется, что DateAdd (по крайней мере, в этом конкретном случае) немного быстрее, чем метод литья пола.
Прежде чем отправиться туда, я проверил этот тест несколько раз, изменив порядок запросов, получив одинаковые результаты.
Это что-то странное на моем сервере, или что?