【问题标题】:Oracle 10g - Removing time componentOracle 10g - 删除时间组件
【发布时间】:2012-03-30 19:20:13
【问题描述】:

我有一个日期文本字段,尽管有时它也有时间部分。例如:

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

需要对月份进行一些数字格式和一些连接,但这非常有效。

【问题讨论】:

    标签: sql oracle date


    【解决方案1】:

    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
    

    【讨论】:

    • 但是在 TRUNC 之后将日期更改为 MON-YYYY 格式很热门?我做不到。
    • 但是你为什么要这样做呢?要创建另一个 VARCHAR2 字符串并将其存储在该格式的某个位置?显示格式取决于您的区域设置!如果您想将其存储为 VARCHAR2,则使用正确格式的 TO_CHAR。
    • 这个日期列稍后将用于分组,这就是原因。用户可能希望按月、年或日进行。并且该列必须是文本的,因为它是通用的。
    • @WoF_Angel:您的要求似乎自相矛盾。在您的问题中,您抱怨“上述方法有效,但我只剩下一个字符串,而不是日期”;现在您抱怨您想要MON-YYYY 格式的字符串而不是日期。我错过了什么?
    • 日期没有格式——它是日期的内部表示。例如,如果您希望 SQL*Plus 以特定格式显示日期,那么ALTER SESSION SET NLS_DATE_FORMAT = 'MON-YYYY'; 就是您的朋友。但它仍然是一个日期(没有显示的日期和时间)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2011-10-02
    • 1970-01-01
    • 2013-01-11
    • 2015-10-13
    • 2010-12-24
    相关资源
    最近更新 更多