我正在尝试将保存在我的表中的时间戳转换为日期,但由于某种原因,它返回相同的日期,或者它给了我一个奇怪的错误:
ORA-01830: date format picture ends before converting entire input string
以下是我尝试过但没有成功的事情:
Change_Date
字段的类型为TIMESTAMP(6)
SELECT TO_DATE (Change_Date, 'YYYY-MON-DD') FROM test
它给了我上述错误。
SELECT CAST(SYSTIMESTAMP AS DATE) FROM test
格式没有变化。
SELECT TO_DATE(To_Char(Change_Date)) FROM test
没有变化。
SELECT To_Char(to_date(Change_Date, 'DD-MON-YY')) FROM test
没有运气。
以及其他一些我不记得的技巧,但它总是返回相同的格式 - 16-DEC-14 07.59.24.097000 AM
我只需要输出日期 - 例如16-DEC-14
我知道我在这里错过了一小部分,但我无法发现它。你能帮我推吧!
答案 0 :(得分:3)
要截断DATE或TIMESTAMP值的时间部分,您应该使用TRUNC函数。默认情况下,它会截断时间部分,返回时间为午夜的日期。
根据您的数据库版本,您可以直接截断时间戳,或者您可能必须先将其转换为DATE,例如
TRUNC(Change_Date)
或
TRUNC(CAST(Change_Date as Date))
正如我在评论中提到的,日期不具备格式。日期类型的值,就像数字一样,以特定的二进制格式存储,不受语言环境或格式的影响。只有当您尝试将日期转换为字符串或将字符串解析为日期时,格式才会起作用。
因为日期(和数字)有时converted to strings implicitly出现混淆,例如出于显示目的,在比较不同类型的值时会出现混淆。在这种情况下,数据库将使用默认语言环境在进行比较之前从一种类型转换为另一种类型。
这种隐式转换会让人们认为日期和数字在没有时会有特定的格式。
答案 1 :(得分:1)
SELECT To_Char(Change_Date, 'DD-MON-YY') FROM test
编辑做一次测试
SELECT SYSDATE, CURRENT_TIMESTAMP FROM DUAL;
SYSDATE CURRENT_TIMESTAMP
-------------------- -------------------------------------
16-DEC-2014 10:30:59 16-DEC-2014 10.30.59.608090000 EUROPE/AMSTERDAM
SELECT to_char(SYSDATE,'DD-MM-YYYY'), to_char(CURRENT_TIMESTAMP,'DD-MM-YYYY') FROM DUAL;
TO_CHAR(SYSDATE,'DD-MM-YYYY') TO_CHAR(CURRENT_TIMESTAMP,'DD-MM-YYYY')
----------------------------- ---------------------------------------
16-12-2014 16-12-2014
我只需要输出日期 - 例如16-DEC-14
16-DEC-14不是日期的字符串表示