我有一个日期的文本字段,虽然有时它也有时间组件.例如:
"23/1/1999"
"25/2/2003 05:18:00"
Run Code Online (Sandbox Code Playgroud)
现在,我只想查询它们并仅按日期组件排序.我的尝试
TO_DATE(
TO_CHAR(
TO_DATE(mytextfield , 'DD-MM-YYYY HH:MI:SS')
,'DD-MM-YYYY')
,'MON-YYYY')
Run Code Online (Sandbox Code Playgroud)
以上在TO_DATE外部失败(ORA-01843无效月份.)
TO_CHAR(
TO_DATE(mytextfield , 'DD-MM-YYYY HH:MI:SS')
,'DD-MM-YYYY')
Run Code Online (Sandbox Code Playgroud)
上面的工作,但我留下了一个字符串,而不是一个日期.
--------解决方案使用接受的答案
只是用
EXTRACT(MONTH FROM TO_DATE(timetable.string_time) , 'DD-MM-YYYY HH24:MI:SS'))
EXTRACT(YEAR FROM TO_DATE(timetable.string_time) , 'DD-MM-YYYY HH24:MI:SS'))
Run Code Online (Sandbox Code Playgroud)
如答案所述,您可以在ORDER BY和SELECT中交换使用它的顺序.
本月将需要一些数字格式,以及一些concats,但这非常有效.
NLS_DATE_FORMAT指定与TO_CHAR和TO_DATE函数一起使用的默认日期格式.让我们改变它以从SQL*Plus获得不错的输出:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
Run Code Online (Sandbox Code Playgroud)
首先,我们使用TO_DATE将日期的文本表示转换为实际日期类型(请注意,下面的日期格式接受较短的文本):
SELECT TO_DATE('25/2/2003 05:18:00', 'DD-MM-YYYY HH24:MI:SS') FROM DUAL;
2003-02-25 05:18:00
SELECT TO_DATE('25/2/2003', 'DD-MM-YYYY HH24:MI:SS') FROM DUAL;
2003-02-25 00:00:00
Run Code Online (Sandbox Code Playgroud)
第二 - 我们想截断日期以摆脱不必要的字段(TRUNC函数):
SELECT TRUNC(TO_DATE('25/2/2003 05:18:00', 'DD-MM-YYYY HH24:MI:SS')) FROM DUAL;
2003-02-25 00:00:00
SELECT TRUNC(TO_DATE('25/2/2003 05:18:00', 'DD-MM-YYYY HH24:MI:SS'),'MONTH') FROM DUAL;
2003-02-01 00:00:00
Run Code Online (Sandbox Code Playgroud)
现在您可以使用此功能,ORDER BY或者GROUP BY您希望根据年/月/日(等等)进行排序.
如果你想做一些异国情调的分类(对于你不关心的分组:{year,month}没有任何不同{month, year}) - 例如月/年,那么我认为你需要编写各个字段并使用以下内容:
SELECT EXTRACT(MONTH FROM DATE '1998-03-07') FROM DUAL;
3
SELECT EXTRACT(YEAR FROM DATE '1998-03-07') FROM DUAL;
1998
Run Code Online (Sandbox Code Playgroud)