簡體   English   中英

如何在 Oracle 中格式化和排序日期?

[英]How to format and sort a date in Oracle?

在我的應用程序中,我嘗試對日期進行格式化和排序,我使用to_char() function 將日期格式化為我需要的格式,但是當我對它們進行排序時,它會將其排序為字符串排序。 但我希望它們按日期排序。

我需要一些幫助才能在同一個查詢中實現兩者。 請幫助我。

我使用的查詢是,

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

聽起來你想要類似的東西

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

SELECT列表中,您希望以您的首選格式返回一個表示日期的字符串。 ORDER BY子句中,您希望按實際日期排序。 例如,使用標准EMPDEPT

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 不知道您正在應用的 function(在本例中為 TO_CHAR)提供了從表中的數據到 Z7148E6221F39393 中的數據的一對一映射例如,兩個不同的日期(2010 年 10 月 1 日 10:15:15 和 2010 年 10 月 1 日 23:45:50)可能會生成相同的字符 output,從而強制 Z30162ED78B6C10F731411F2FC4440C24FZ 刪除兩個字符串中的一個但是這兩個日期的排序方式不同。 您可以通過在執行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.

最簡單的方法是再次使用查詢檢索相同的字段並根據該字段進行排序

在你的例子中

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
SELECT 
         to_char( your_date_column, your_format_mask ) as formate_purpose,

FROM your_table

ORDER BY to_date (formate_purpose)

試試上面的代碼

您沒有說明您的應用程序是用什么編寫的,但在某些環境中(例如 Oracle APEX、Oracle 報告),解決方案是不在查詢中使用to_char ,然后在工具的“列屬性”中應用所需的格式或相似的。

如果您讓 Oracle 排序(推薦),請按照 Justin Cave 的回答中所述進行操作。 如果由於某種原因,您在 Java 中進行排序,請不要使用to_char 獲取日期作為Date對象,並使用例如SimpleDateFormat在 Java 中進行格式化(排序后)。

對於 sqlplus,使用 alter session 將 nls_date_format 設置為您想要的日期格式,然后只需使用 select 語句中的列名和排序順序。

我想按日期字段分組和排序,但日期字段包括時間,我不想在分組和排序中包括時間。 所以我將日期轉換為字符,然后將字符轉換回日期以消除時間並按日期而不是文本排序。 這將數據按日期分組並按日期排序。

-- 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM