Oracle 10g - 删除时间组件

时间:2012-03-30 19:20:14

标签: sql oracle date

我有一个日期的文本字段,虽然有时它也有时间组件。例如:

"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中交换使用它的顺序。

月份需要一些数字格式,以及一些会话,但这很有效。

1 个答案:

答案 0 :(得分:6)

NLS_DATE_FORMAT指定用于TO_CHARTO_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 BYGROUP 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