Проблема с получением объекта DateTime с использованием Sql - PullRequest
0 голосов
/ 04 мая 2009

Учитывая дату 2009/04/30, в одной из строк я хочу получить все даты <= 2009/04/30 и> = 2009/04/30. SQL-операторы выглядят так:

select dateColumn from someTable where dateColumn <= '2009/4/30'

select dateColumn from someTable where dateColumn >= '2009/4/30'

Вышеприведенные 2 оператора выполняются, но первый оператор возвращает все даты ниже 2009/04/30, похоже, он исключает дату, даже если она появляется в БД. Есть идеи, почему это может происходить? Как бы я сравнил часть даты объекта DateTime в sql?

Ответы [ 8 ]

5 голосов
/ 04 мая 2009

SQL Server хранит даты вместе со временем.

select dateColumn from someTable where dateColumn <= '2009/4/30'

возвращает все даты, меньшие или равные 2009/4/30 00:00:00.

Если ваша дата по крайней мере на 1/300 секунд больше, e. г. 2009/4/30 00:00:00.003, возврат не будет.

Вам нужно выбрать вот так:

select dateColumn from someTable where dateColumn < '2009/5/01'

или как это:

select dateColumn from someTable where dateColumn < DATEADD(day, 1, '2009/4/30')
1 голос
/ 04 мая 2009

выберите датуКолонна из некоторого стола где dateColumn между dateadd (дд, -1, '2009/4/30') и dateadd (дд, 1, '2009/4/30')

этот запрос выберет столбцы со значением dateColumn между двумя указанными вами датами, включая их также. Надеюсь, это решит вашу проблему.

1 голос
/ 04 мая 2009

Первый запрос неявно преобразует вашу строку даты в datetime. Это преобразование дает:

2009-04-30 00:00:00.000

Возможно ли, что исключенная дата будет в тот же день, но в более позднее время, которое будет исключено вышеуказанным значением?

1 голос
/ 04 мая 2009

Содержит ли столбец данные о времени? Как написано, первый запрос вернет записи, где dateColumn меньше или равен 2009/4/30 в 12:00 (полночь). Вы можете использовать CAST или CONVERT только для сравнения временных интервалов, но в этом случае самый простой ответ - изменить первый запрос на:

select dateColumn from someTable where dateColumn < '2009/5/1'
0 голосов
/ 04 мая 2009

Что бы ни создавало ваши данные, включая время, отличное от 12:00.

Я нашел это в блоге Джеффа по SQL Server и использую его, чтобы избавиться от времени, когда все, что мне нужно, это дата:

dateadd(dd,0, datediff(dd,0,@DateTime))

Таким образом, ваш запрос может быть:

select dateColumn from someTable where dateadd(dd,0, datediff(dd,0, [dateColumn]))<= '2009/4/30'

Я сделал это функцией, так как она часто используется.

0 голосов
/ 04 мая 2009

На странице документации MySQL есть очень полезный список вспомогательных функций, которые вы можете использовать. В вашем запросе вы сравниваете строку, а не дату. Это может сработать, если вы напишите месяц как две цифры 04 вместо 4. В любом случае, вам лучше конвертировать в UNIX_TIMESTAMP и сравнивать по нему.

0 голосов
/ 04 мая 2009

Когда вы указываете дату в виде строки и не указываете время, она использует полночь (12:00 AM) этой даты. Если вы хотите включить все время в определенную дату (а не только в полночь), используйте сравнение меньше, чем последующая дата - что проще и точнее, чем использование 11:59:59 PM.

.
select dateColumn from someTable where dateColumn < '2009/5/1'

В качестве альтернативы вы можете привести дату, чтобы исключить время, но вы должны быть осторожны, чтобы упорядочить сравнение как yyyymmdd, чтобы получить правильный порядок. Преобразование строки в дату также будет работать, но вам все равно нужно убедиться, что вы сравниваете полночь следующего дня, а не полночь указанной даты.

select dateColumn from someTable where CONVERT(varchar,dateColumn,112) <= '2090430'
0 голосов
/ 04 мая 2009

Не сравнивать даты со строками.

http://rtipton.wordpress.com/2009/01/18/converting-dates-in-sql-server/

Что касается получения части даты, даты внутренне представляются в виде чисел с плавающей запятой, где 1 - один день.

CONVERT(DATETIME, CONVERT(INT, GETDATE()))

Произойдет конвертация даты в дату, которую вы хотите.

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