gpt4 book ai didi

sql - Oracle 日期到字符串的转换

转载 作者:行者123 更新时间:2023-12-04 01:29:42 26 4
gpt4 key购买 nike

执行此操作时,我有一个字符串列 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?请帮忙

最佳答案

The data in COL1 is in 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

应该做的伎俩。请注意,我还更改了 monmm如您的示例是 27-11-89它有一个月份的数字,而不是“单词”(如 NOV)

更多详细信息请参见手册: http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215

关于sql - Oracle 日期到字符串的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13591546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com