Как отформатировать и отсортировать дату в Oracle? - PullRequest
11 голосов
/ 17 августа 2011

В моем приложении я пытаюсь отформатировать и отсортировать дату, я использую функцию to_char() для форматирования даты в мой требуемый формат, но когда я сортирую их, она сортируется как сортировка строк.Но я хочу, чтобы они были отсортированы по дате.

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

Запрос, который я использовал, был

SELECT to_char( t1.your_date_column1, your_format_mask ) as alias,
  FROM your_table1 t1,your_table2
 ORDER BY t1.your_date_column1

Ответы [ 7 ]

15 голосов
/ 17 августа 2011

Звучит так, как будто вы хотите что-то вроде

SELECT to_char( your_date_column, your_format_mask )
  FROM your_table
 ORDER BY your_date_column

В списке SELECT вы хотите вернуть символьную строку, которая представляет дату в вашем предпочтительном формате. В предложении ORDER BY вы хотите сделать заказ по фактической дате. Используя стандартные таблицы EMP и DEPT, например

SQL> ed
Wrote file afiedt.buf

  1  select to_char( hiredate, 'DD-MM-YYYY' )
  2    from emp,
  3         dept
  4   where emp.deptno = dept.deptno
  5*  order by hiredate
SQL> /

TO_CHAR(HI
----------
17-12-1980
20-02-1981
22-02-1981
02-04-1981
01-05-1981
09-06-1981
08-09-1981
28-09-1981
17-11-1981
03-12-1981
03-12-1981
23-01-1982
19-04-1987
23-05-1987

14 rows selected.

Если вы добавляете DISTINCT, проблема в том, что Oracle не знает, что функция, которую вы применяете (в данном случае TO_CHAR), обеспечивает взаимно-однозначное сопоставление данных в таблице с данными в выходных данных. , Например, две разные даты (1 октября 2010 г. 10:15:15 и 1 октября 2010 г. 23:45:50) могут генерировать один и тот же символьный вывод, заставляя Oracle исключить одну из двух строк '01 -10-2010 ' но две даты будут сортироваться по-разному. Вы можете устранить эту проблему, вложив запрос и преобразовав строку обратно в дату после выполнения DISTINCT и до выполнения ORDER BY

SQL> ed
Wrote file afiedt.buf

  1  select hire_date_str
  2    from (
  3      select distinct to_char( hiredate, 'DD-MM-YYYY' ) hire_date_str
  4        from emp,
  5             dept
  6       where emp.deptno = dept.deptno
  7      )
  8*  order by to_date(hire_date_str,'DD-MM-YYYY')
SQL> /

HIRE_DATE_
----------
17-12-1980
20-02-1981
22-02-1981
02-04-1981
01-05-1981
09-06-1981
08-09-1981
28-09-1981
17-11-1981
03-12-1981
23-01-1982
19-04-1987
23-05-1987

13 rows selected.
3 голосов
/ 26 марта 2014
SELECT 
         to_char( your_date_column, your_format_mask ) as formate_purpose,

FROM your_table

ORDER BY to_date (formate_purpose)

Попробуйте код выше

2 голосов
/ 28 апреля 2012

Самый простой способ - это снова получить то же поле с запросом и выполнить сортировку по этому полю

В вашем примере

SELECT 
         to_char( your_date_column, your_format_mask ) as formate_purpose,
         your_date_column as sorting_purpose
FROM your_table

ORDER BY your_date_column
1 голос
/ 17 августа 2011

Вы не говорите, для чего написано ваше приложение, но в некоторых средах (например, Oracle APEX, Oracle Reports) решение состоит в том, чтобы не использовать to_char в запросе, а затем применитьжелаемое форматирование в «свойствах столбца» инструмента или аналогичных.

0 голосов
/ 24 апреля 2014

Я хотел группировать по и упорядочивать по дате, но поле даты включало время, и я не хотел включать время в группировку и сортировку. Поэтому я преобразовал дату в символ, а затем преобразовал символ обратно в дату, чтобы исключить время и отсортировать по дате, а не по тексту. Это сгруппировало данные по дате и отсортировало по дате.

-- Projects initiated by Day.
select to_date(to_char(psd.PROJECTSTATUSDATE, 'mm/dd/yyyy'),'mm/dd/yyyy') as "Date", count(*)
from project pj, project_status_date psd
where PJ.PROJECTTOKEN = PSD.PROJECTTOKEN
      and psd.PROJECTSTATUSDATE > '01-JAN-2001'
      and PSD.PROJECTSTATUSCODE = 'BL'
group by to_date(to_char(psd.PROJECTSTATUSDATE, 'mm/dd/yyyy'),'mm/dd/yyyy') 
order by to_date(to_char(psd.PROJECTSTATUSDATE, 'mm/dd/yyyy'),'mm/dd/yyyy') 

Date      Count
8/16/2013   102
8/19/2013   77
8/20/2013   257
8/21/2013   30
8/22/2013   173
8/23/2013   125
8/26/2013   41
8/27/2013   25
8/28/2013   14
0 голосов
/ 30 августа 2013

Для sqlplus используйте alter session, установите для nls_date_format желаемый формат даты, а затем просто используйте имя столбца в операторе select и порядок сортировки.

0 голосов
/ 17 августа 2011

Если вы разрешите сортировку Oracle ( рекомендуется ), просто сделайте это, как описано в ответе Джастина Кейва.Если по какой-то причине вы выполняете сортировку в Java, не используйте to_char;вместо этого получите даты как Date объекты и используйте, например, SimpleDateFormat для форматирования в Java (после сортировки).

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