在Oracle中订购VARCHAR2日期

Zac*_*ber 3 sql oracle

我有一个VIEW包含'MM/DD/YYYY'格式的日期值的列.

如果此列仅包含我列出的格式的日期值,我可以ORDER BY在列上添加一个日期值,TO_DATE以使VIEW按该日期排序:

ORDER BY TO_DATE(MY_DATE_COLUMN, 'MM/DD/YYYY') desc
Run Code Online (Sandbox Code Playgroud)

但是,此列中的数据未格式化为"MM/DD/YYYY".

无论如何只是使用SQL能够对该列进行排序实现为DATE列?

我认为这是不可能的,因为数据没有被格式化为'MM/DD/YYYY',但我不完全确定......

我不想在其中添加另一列VIEW来完成此操作.

Gor*_*off 5

一种方法是手动验证日期:

order by (case when substr(MY_DATE_COLUMN, 1, 2) between '01' and '12' and
                    substr(my_date_column, 3, 1) = '/' and
                    substr(my_date_column, 4, 2) between '01' and '31' and
                    substr(my_date_column, 5, 1) = '/' and
                    substr(my_date_column, 6, 4) between '1900' and '2100' and
                    len(my_date_column) = 10
               then to_date(MY_DATE_COLUMN, 'mm/dd/yyyy')
          end) desc
Run Code Online (Sandbox Code Playgroud)

这对于大多数用途来说可能已经足够了,尽管它将允许2月30日.

你真正想要的是Oracle中的IsDate函数,但它不可用.

在发布之后我意识到可能有一种更简单的方法:

order by substr(my_date_column, 6, 4) desc, substr(MY_DATE_COLUMN, 1, 2) desc,
         substr(my_date_column, 4, 2) desc
Run Code Online (Sandbox Code Playgroud)

它只提取年,月,日和降序.非日期将混合在一起,具体取决于它们包含的内容.然而,提问者似乎并不关心顺序,只是简单地消除了语法错误.