我有一个日期的文本字段,虽然有时它也有时间组件。例如:
"23/1/1999"
"25/2/2003 05:18:00"
现在,我只想查询它们并仅按日期组件排序。我的尝试
TO_DATE(
TO_CHAR(
TO_DATE(mytextfield , 'DD-MM-YYYY HH:MI:SS')
,'DD-MM-YYYY')
,'MON-YYYY')
以上在TO_DATE外部失败(ORA-01843无效月份。)
TO_CHAR(
TO_DATE(mytextfield , 'DD-MM-YYYY HH:MI:SS')
,'DD-MM-YYYY')
上述作品,但我留下了一个字符串,而不是日期。
--------使用已接受答案的解决方案
只需使用
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'))
如答案所述,您可以在ORDER BY和SELECT中交换使用它的顺序。
月份需要一些数字格式,以及一些会话,但这很有效。
答案 0 :(得分:6)
NLS_DATE_FORMAT
指定用于TO_CHAR
和TO_DATE
函数的默认日期格式。让我们改变它以从SQL * Plus获得良好的输出:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
首先我们使用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
第二 - 我们想截断日期以摆脱不必要的字段(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
现在您可以在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