【问题标题】:Oracle date to string conversionOracle 日期到字符串的转换
【发布时间】:2012-11-27 19:24:47
【问题描述】:

执行此操作时,我有一个字符串列 COL1

SELECT TO_CHAR(TO_DATE(COL1,'dd-mon-yy'), 'mm/dd/yyyy')
FROM TABLE1

COL1 中的数据在 dd-mon-yy 中,例如:27-11-89 和 89 是 1989,但选择返回它为 11/27/2089。

我必须做一个内部 TO_DATE,因为如果我不这样做,我会收到一个无效号码错误(ORA-01722:无效号码)

如何显示 1989 而不是 2089?请帮忙

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    COL1 中的数据在 dd-mon-yy

    不,不是。 DATE没有有任何格式。只有在您显示它时,它才会由您的 SQL 客户端(隐式)转换为该表示形式。

    如果 COL1 确实是一个 DATE 列,则在其上使用 to_date() 是无用的,因为 to_date() 将字符串转换为 DATE。

    你只需要to_char(),没有别的:

    SELECT TO_CHAR(col1, 'mm/dd/yyyy') 
    FROM TABLE1
    

    在您的情况下发生的情况是调用 to_date()DATE 转换为字符值(应用默认 NLS 格式),然后将其转换回 DATE。由于这种双重隐式转换,一些信息会在途中丢失。


    编辑

    所以你确实犯了一个大错误,将 DATE 存储在字符列中。这就是你现在遇到问题的原因。

    最好的(老实说:唯一明智的)解决方案是将该列转换为DATE。然后,您可以将值转换为您想要的任何表示形式,而无需担心隐式数据类型转换。

    但最有可能的答案是“我继承了这个模型,我必须应对它”(总是这样,显然没有人负责选择错误的数据类型),那么你需要使用RR 而不是YY

    SELECT TO_CHAR(TO_DATE(COL1,'dd-mm-rr'), 'mm/dd/yyyy')
    FROM TABLE1
    

    应该可以解决问题。请注意,我还将mon 更改为mm,因为您的示例是27-11-89,其中包含月份的数字,而不是“单词”(如NOV

    更多详情见手册:http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215

    【讨论】:

    • 对不起,它是一个字符串列。我已经编辑了我为什么要这样做的问题。
    • @Ram:不要将日期放入字符列。您现在遇到的问题,只是因为您这样做而存在。
    • 感谢您的解决方案。我将尝试将数据源从 char 更改为 date col。我们从源获得的日期是 Y2K 字符串格式,需要一个用户定义的函数来转换为日期。
    【解决方案2】:

    试试这个。甲骨文有这个功能来区分千年..

    正如您所提到的,如果您的列是 varchar,那么下面的查询将为您生成 1989..

    select to_date(column_name,'dd/mm/rr') from table1;

    当年使用rr格式时,oracle会执行以下操作。

    如果 rr->00 到 49 ---> 结果将是 2000 - 2049, 如果 rr->50 到 99 ---> 结果将是 1950 - 1999

    【讨论】:

      【解决方案3】:

      如果您的列是 DATE 类型(如您所说),那么您不需要先将其转换为字符串(实际上您会先将其隐式转换为字符串,然后显式到日期并再次显式到字符串):

      SELECT TO_CHAR(COL1, 'mm/dd/yyyy') FROM TABLE1
      

      您在专栏中看到的日期格式是您使用的工具(TOAD、SQL Developer 等)及其语言设置的产物。

      【讨论】:

      • 对不起,它是一个字符串列。我已经编辑了我为什么要这样做的问题。
      【解决方案4】:

      要注意的另一件事是,您正在尝试将日期转换为 mm/dd/yyyy,但如果您有计划将此转换后的日期与其他日期进行比较,请确保仅将其转换为 yyyy-mm-dd 格式因为 to_char 从字面上将其转换为字符串,并且使用任何其他格式,我们将得到不希望的结果。 有关更多解释,请遵循以下内容: Comparing Dates in Oracle SQL

      【讨论】:

        【解决方案5】:
        SELECT * from 
        (SELECT TO_CHAR(COL1, 'yyyy-MM-dd') as col1 FROM TABLE1
        ) T
        WHERE col1 ='2021-11-12'
        

        【讨论】:

        • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
        猜你喜欢
        • 1970-01-01
        • 2013-04-14
        • 2016-05-08
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        相关资源
        最近更新 更多