разделить строку в запросе SQL - PullRequest
0 голосов
/ 21 января 2010

У меня есть значение в поле «postingdate» в виде строки в формате 2009-11-25, 12:42AM IST, в таблице с именем «Post».

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

select postingdate 
from post 
where TO_DATE(postingDate,'YYYY-MM-DD')>61689 
  and TO_DATE(postingDate,'YYYY-MM-DD')<61691

Ответы [ 4 ]

1 голос
/ 21 января 2010

Как вы теперь видели, попытка выполнить любой запрос к строковому столбцу, который представляет дату, является проблемой. У вас есть несколько вариантов:

  1. Преобразовать столбец postingdate в какой-либо тип данных DATE или TIMESTAMP. Я думаю, что это ваш лучший выбор, так как запрос к таблице с использованием этого поля будет быстрее, более гибким и менее подверженным ошибкам.

  2. Оставьте postingdate в виде строки и используйте функции для преобразования ее обратно в дату при выполнении сравнений. Это будет проблемой производительности, так как большинство запросов превратится в полное сканирование таблицы, если ваша база данных не поддерживает индексы на основе функций.

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

Если бы это был я, я бы преобразовал данные. Удачи.

0 голосов
/ 21 января 2010

Если это действительно строка, вам повезло, что она в формате ГГГГ-ММ-ДД. Вы можете отсортировать и сравнить этот формат в виде строки, потому что наиболее значимые числа находятся слева. Например:

select *
from Posts
where StringDateCol between '2010-01-01' and '2010-01-02'

Нет необходимости преобразовывать строку в дату, сравнение с этим способом не влияет на , 12:42AM IST придаток. Если, конечно, ваша таблица не содержит даты из другого часового пояса :)

0 голосов
/ 21 января 2010

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

Фактические функции будут зависеть от вашей РСУБД

for strings only
select * from posts
where LEFT(postingDate,10) > '2010-01-21'

or
for datetime ( Sybase example)
select * from posts
where convert(DateTime,postingDate) between '2010-01-21' and '2010-01-31'
0 голосов
/ 21 января 2010

В SQL Server вы можете сказать

  Select postingdate from post 
  where postingdate between '6/16/1969' and '6/16/1991'
...