2011-12-29 5 views
0

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

т.е.

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

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

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

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

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

Edit, пример того, почему 3 мс

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) 
+0

Почему '3ms', а не' 1ms'? Это обходной путь для некоторого тонкого сбоя datetime в SQL Server? –

+1

@ Lukas Eder: datetime измеряет 1/300 вторых интервала, равные 3,33. Это, вероятно, не нужно здесь, на двух мыслях ... – gbn

+0

Приятно знать, хотя! –

1

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

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

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

1

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

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

Of курс - если тип вашей колонки DATETIME

 Смежные вопросы

  • Нет связанных вопросов^_^