如何根据日期订购我的列“日期”

时间:2015-11-27 07:03:48

标签: sql oracle

以下是我的观点,应该按照“每周假期”排序 “年度假期”为第二个,“特殊节日”为第三个,并根据日期的顺序按照“日期”栏目进行订购,这是日期如何订购jan,feb,mar等。

   Create or Replace view VW_TBL_HOILDAY_APLICATION as    
       SELECT DISTINCT
        CASE A.DESCRIPTION
          WHEN 'Weekly holiday'
          THEN TO_CHAR(A.Holiday_date,'FMDAY')
          WHEN 'Annual holiday'
          THEN TO_CHAR(A.holiday_date,'dd-MON')
          WHEN 'Special_Date_Holiday'
          THEN TO_CHAR(A.holiday_date,'dd-MON-yy')
        END                                                AS Dates,
        A.DESCRIPTION
        FROM tbl_holiday_master A
        where A.description in('Weekly holiday','Annual holiday','Special_Date_Holiday') 
        order by CASE A.DESCRIPTION
                    WHEN 'Weekly holiday' 
                    THEN '1'
                    WHEN 'Annual holiday'
                    THEN '2'
                    WHEN 'Special_Date_Holiday'
                    THEN '3'
                  END ASC, Dates ASC;

但我的输出是这样的::

    DATES   DESCRIPTION
--------------------------    
    SUNDAY  Weekly holiday
    02-OCT  Annual holiday
    15-AUG  Annual holiday
    26-JAN  Annual holiday
    11-NOV-15   Special_Date_Holiday
    25-DEC-15   Special_Date_Holiday
    25-JAN-15   Special_Date_Holiday

P.S。: - 视图中我的列日期的数据类型是varchar,因为它在星期日并根据字符串进行排序。 谢谢!

1 个答案:

答案 0 :(得分:2)

问题在于您 DATE 转换字符串

CASE A.DESCRIPTION
      WHEN 'Weekly holiday'
      THEN TO_CHAR(A.Holiday_date,'FMDAY')
      WHEN 'Annual holiday'
      THEN TO_CHAR(A.holiday_date,'dd-MON')
      WHEN 'Special_Date_Holiday'
      THEN TO_CHAR(A.holiday_date,'dd-MON-yy')
END

请勿在视图中执行此操作,但只要您在查询视图时显示日期,就可以这样做。

将视图创建为:

CREATE OR REPLACE VIEW VW_TBL_HOILDAY_APLICATION
AS
  SELECT DISTINCT A.holiday_date AS holiday_date,
    A.DESCRIPTION
  FROM tbl_holiday_master A
  WHERE A.description IN('Weekly holiday',
                         'Annual holiday',
                         'Special_Date_Holiday');

然后格式排序日期查询视图

SELECT
  CASE DESCRIPTION
    WHEN 'Weekly holiday'
    THEN TO_CHAR(holiday_date,'FMDAY')
    WHEN 'Annual holiday'
    THEN TO_CHAR(holiday_date,'dd-MON')
    WHEN 'Special_Date_Holiday'
    THEN TO_CHAR(holiday_date,'dd-MON-yy')
  END AS Dates,
FROM VW_TBL_HOILDAY_APLICATION
ORDER BY holiday_date;

或者,如果您想坚持原始视图,那么唯一的方法是将实际日期列添加到 SELECT列表并在{中使用它{1}}条款。

ORDER BY

请注意,个人SQL级别CREATE OR REPLACE VIEW VW_TBL_HOILDAY_APLICATION AS SELECT DISTINCT CASE A.DESCRIPTION WHEN 'Weekly holiday' THEN TO_CHAR(A.Holiday_date,'FMDAY') WHEN 'Annual holiday' THEN TO_CHAR(A.holiday_date,'dd-MON') WHEN 'Special_Date_Holiday' THEN TO_CHAR(A.holiday_date,'dd-MON-yy') END AS Dates, A.DESCRIPTION, A.holiday_date holiday_date FROM tbl_holiday_master A WHERE A.description IN('Weekly holiday','Annual holiday','Special_Date_Holiday') ORDER BY CASE A.DESCRIPTION WHEN 'Weekly holiday' THEN '1' WHEN 'Annual holiday' THEN '2' WHEN 'Special_Date_Holiday' THEN '3' END ASC, holiday_date; 子句始终> <{1}}中提到的排序优先级