SQL datepart mmm yy未按时间顺序排序

时间:2020-06-25 15:50:17

标签: sql oracle date select sql-order-by

我无法使用我想要的月份年份格式的日期部分coz对mmm yy摘要进行排序

获得如下输出

Col1   Col2
AA     Apr 19
BB     Feb 20
CC     Dec 19 
DD     May 19
EE     Jan 20

如何在本月明智地进行排序

预期结果

Col1   Col2
AA     Apr 19 
DD     May 19
CC     Dec 19
EE     Jan 20
BB     Feb 20

3 个答案:

答案 0 :(得分:2)

在Oracle中,您可以为此使用to_date()

select col1, col2
fro mytable 
order by to_date(col2, 'mon yy')

请注意,Oracle根据NLS参数(例如NLS_DATE_LANGUAGE)来解释月份名称。因此,要使其正常工作,数据库的语言必须是美国语言。

如果不是这种情况,您可以尝试将参数强制作为to_date()的第三个参数:

to_date(col2, 'mon yy', 'NLS_DATE_LANGUAGE=American')

答案 1 :(得分:1)

一种方法是:

order by year, 
         (case month when 'Jan' then 1 when 'Feb' then 2 . . . end)

根据数据库的不同,可能有更简单的表达方式。

答案 2 :(得分:1)

这是一个将日期转换为mmm yy格式的查询

在工作数月时,您大概是按月汇总每日数据,并且目前正在做类似的事情:

select count(*) as col1,
  to_char(your_column, 'Mon RR', 'NLS_DATE_LANGUAGE=ENGLISH') as col2
from your_table
group by to_char(your_column, 'Mon RR', 'NLS_DATE_LANGUAGE=ENGLISH')
order by col2;

按日期的字符串表示形式对数据进行排序。 (那不完全是您在示例中显示的内容,但是不确定您是否刚刚创建了它……)

如果您使用实际月份进行汇总,则可以通过截断日期值(给出该月的第一天)来进行分组,然后按该截断日期进行排序;并仅在最后一刻转换为字符串以供显示:

select count(*) as col1,
  to_char(trunc(your_column, 'MM'), 'Mon RR', 'NLS_DATE_LANGUAGE=ENGLISH') as col2
from your_table
group by trunc(your_column, 'MM')
order by trunc(your_column, 'MM');

db<>fiddle

就像@GMB一样,我已经指定了月份缩写的语言。