Как я могу исключить верхний предел на сервере SQL между - PullRequest
1 голос
/ 29 декабря 2011

Я использую SQL Server в качестве базы данных. Я ищу строку для даты, которую я ввел. Это означает поиск строк, где submission_date в точности '12/13/2011'. Сначала я конвертирую дату критерия поиска в миллисекунды

т.е.

Dec 13 2011 00:00:00 ='1323727200000'
Dec 14 2011 00:00:00 ='1323813600000'`

SELECT * 
FROM log_file 
WHERE submission_date BETWEEN '1323727200000' AND '1323813600000' 

Этот запрос будет искать от Dec 13 Midnight до Dec 14 Midnight, но я хочу пропустить верхнее предельное значение, то есть с Dec 13 2011 00:00:00 до Dec 13 2011 59:59:59. Для этого я подумал использовать >= and <. Это правильный подход?

Сделав это, у меня есть iBatis xml, где я пишу следующее, что дает мне ошибку.

<isNotEmpty prepend="AND" property="submissiondate">
   submission_date <![CDATA[ >= ]]> #submissiondate # AND <![CDATA[ < ]]> #submissiondate #
</isNotEmpty>

Пожалуйста, предложите, если это правильный подход.

Спасибо

Ответы [ 3 ]

4 голосов
/ 29 декабря 2011

Да, вы бы использовали >= и <, как правило, для запросов диапазона времени / даты

В качестве альтернативы вы можете вычесть 3 миллисекунды из верхнего предела, чтобы получить наибольшее значение datetime (не новее datetime2) для этого дня (xxx 23:59.59.997)

SELECT * FROM   log_file
WHERE  submission_date BETWEEN 1323714600000 AND 1323801000000-3

Примечание: вычитание 1, вероятно, будет в порядке, если все в миллисекундах ...

Редактировать, пример того, почему 3ms

SELECT 
    DATEADD(millisecond, -1, '20111214'), -- 2011-12-14 00:00:00.000
    DATEADD(millisecond, -2, '20111214'), -- 2011-12-13 23:59:59.997
    DATEADD(millisecond, -3, '20111214')  -- 2011-12-13 23:59:59.997

И что интересно, ты уверен, что сейчас полночь?
За 1323813600 секунд я получаю 2011-12-13 22:00:00

В SQL Server:

SELECT DATEADD(second, 1323813600, '19700101') 

на MySQL

SELECT FROM_UNIXTIME(1323813600)
2 голосов
/ 29 декабря 2011

В вашем случае, когда кажется, что «дата» имеет тип BIGINT, почему бы просто не вычесть 1 из верхнего предела интервала?

SELECT * FROM log_file 
WHERE submission_date BETWEEN 1323714600000 AND 1323801000000 - 1

Конечно, это не будет работать с плавающей точкойчисла точек или десятичные дроби ...

1 голос
/ 29 декабря 2011

Да, если вам нужно пропустить верхний предел - вы должны использовать

WHERE Date >= '20111213' AND Date < '20111214'

Конечно - если тип столбца DATETIME

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...