2012-03-30 2 views
1

У меня есть текстовое поле, которое является датой, хотя иногда оно также имеет компонент времени. Пример:Oracle 10g - компонент времени удаления

"23/1/1999" 
"25/2/2003 05:18:00" 

Теперь я просто хочу запросить их и заказать только по компоненту даты. Моя попытка

TO_DATE(
     TO_CHAR(
      TO_DATE(mytextfield , 'DD-MM-YYYY HH:MI:SS') 
     ,'DD-MM-YYYY') 
,'MON-YYYY') 

выше не будет работать на внешнем TO_DATE (ORA-01843 недопустимый месяц.)

TO_CHAR(
    TO_DATE(mytextfield , 'DD-MM-YYYY HH:MI:SS') 
,'DD-MM-YYYY') 

указанных работ, но я остаюсь со строкой, а не дата.

-------- Решение с использованием принятого ответа

Просто используйте

EXTRACT(MONTH FROM TO_DATE(timetable.string_time) , 'DD-MM-YYYY HH24:MI:SS')) 

EXTRACT(YEAR FROM TO_DATE(timetable.string_time) , 'DD-MM-YYYY HH24:MI:SS')) 

Как указано на ответ, вы можете поменять порядок ее использовании в ORDER BY и в SELECT.

Нужно немного форматирования числа в месяц, а некоторые конкаты, но это работает очень хорошо.

ответ

6

NLS_DATE_FORMAT определяет формат даты по умолчанию для использования с функциями TO_CHAR и TO_DATE. Давайте изменим его, чтобы получить хороший выход из SQL * Plus:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; 

Сначала мы используем TO_DATE преобразовать текстовое представление даты в режиме реального типа даты (обратите внимание, что формат даты ниже принимает короткий текст):

SELECT TO_DATE('25/2/2003 05:18:00', 'DD-MM-YYYY HH24:MI:SS') FROM DUAL; 
2003-02-25 05:18:00 

SELECT TO_DATE('25/2/2003', 'DD-MM-YYYY HH24:MI:SS') FROM DUAL; 
2003-02-25 00:00:00 

Во-вторых - мы хотим отсечь дату, чтобы избавиться от ненужных полей (TRUNC функция):

SELECT TRUNC(TO_DATE('25/2/2003 05:18:00', 'DD-MM-YYYY HH24:MI:SS')) FROM DUAL; 
2003-02-25 00:00:00 

SELECT TRUNC(TO_DATE('25/2/2003 05:18:00', 'DD-MM-YYYY HH24:MI:SS'),'MONTH') FROM DUAL; 
2003-02-01 00:00:00 

Теперь вы можете использовать этот в ORDER BY или GROUP BY при условии, что вы хотите заказать на основе года/месяца/дня (и так далее).

Если вы хотите сделать экзотическую сортировку (для группировки вам все равно: {year,month} ничем не отличается от {month, year}) - например. месяц/год, то я думаю, что вам нужно составить отдельные поля и использовать следующее:

SELECT EXTRACT(MONTH FROM DATE '1998-03-07') FROM DUAL; 
3 

SELECT EXTRACT(YEAR FROM DATE '1998-03-07') FROM DUAL; 
1998 
+2

+1, но я уверен, что 'HH' должен быть' HH24'. – ruakh

+0

Вы правы. Исправленный. – Anonymous

+0

Но как изменить дату, после TRUNC, в формате MON-YYYY? Я не могу этого сделать. –