Поиск SQL Query Date с использованием Между
Я просто запускаю этот запрос
Select * from ProjectData where logtime between '2012-09-25 12:00:00.000' and '2012-09-25 12:59:59.999' order by LogTime
в попытке найти всю запись за 12 часов, мы записываем каждую секунду, поэтому я ожидал 3600 записей, но, к моему удивлению, у меня было 3601 запись, и последнее рекордное время было
2012-09-25 13:00:00.000
Любая идея, почему эта запись выбрана? Даже если Between
включает данные значения, это значение выше условия. Я использую SQL Server 2012 Express Edition.
- Скрытие баз данных для входа в Microsoft Sql Server 2008R2 и выше
- Настройка состояния NOCOUNT с локальной переменной
- Не удалось подключиться к SQL Server в Hydro GeoAnalyst
- microsoft sql server 2012 express edition - ограничение одновременных вставок
- СОЗДАТЬ МАСТЕР-КЛЮЧ - Ошибка проверки пароля
- Полнотекстовый поиск не работает, если включено стоп-слово, даже если стоп-лист пуст
- SQL Server - та же таблица в нескольких схемах
- Функция SQL не возвращает результатов, но содержимое функции возвращает результаты
- Как получить значения за все месяцы в T-SQL
- Как просмотреть запрос, который использовался для создания таблицы?
- Создать отфильтрованный индекс, не работающий в SQL Server 2012 Express
- Недостаток узла главной таблицы, SQL Server 2012 SP1
- Как предотвратить «истечение тайм-аута запроса»? (Ошибка SQLNCLI11 '80040e31')
Попробуйте использовать тип данных DATETIME2
для столбца logtime
–
Запрос:
DECLARE @temp TABLE (logtime DATETIME2) INSERT INTO @temp (logtime) VALUES ('20120925 12:00:00.000'), ('20120925 12:59:59.999'), ('20120925 13:00:00.000') SELECT * FROM @temp WHERE logtime BETWEEN '2012-09-25 12:00:00.000' AND '2012-09-25 12:59:59.999' ORDER BY logtime
Вывод:
logtime --------------------------- 2012-09-25 12:00:00.0000000 2012-09-25 12:59:59.9990000
DATETIME против DATETIME2:
SELECT name, [precision] FROM sys.types WHERE name IN ('datetime', 'datetime2')
Вывод:
name precision ----------- --------- datetime2 27 datetime 23
Вы использовали Datetime
как тип данных, и у него есть свойство округлять.
Значения Datetime
и времени округляются до приращений .000, .003 или .007 секунд. Подробнее здесь
Например:
SQL Fiddle
Настройка схемы MS SQL Server 2012 :
Запрос 1 :
Declare @testtime datetime = '2012-09-25 12:59:59.999' select @testtime
Результаты :
| COLUMN_0 | ------------------------------------ | September, 25 2012 13:00:00+0000 |
Попробуйте выполнить этот запрос
SELECT CAST('2012-09-25 12:59:59.999' AS DATETIME)
Это выйдет 2012-09-25 13:00:00.000
. Поэтому я думаю, что именно поэтому ваш результат содержит запись со временем 2012-09-25 13:00:00.000
.
Таким образом, на самом деле он выбирает значения между 2012-09-25 12:00:00.000
и 2012-09-25 13:00:00.000