我有这样的约会:
2020/05/09T02:40:03
2020/05/16T02:40:03
2020/05/15T02:40:03
我需要将其转换为日期格式“dd/mm/yyyy”。
我的查询
select cast(date_registered as date) as Reg_date from employee
错误:
Literal does not match format string
Note:I have also used TO_Char , TO_Date but not working
答案 0 :(得分:2)
首先,您尝试转换为 date
的不是 timestamp
,而是字符串。
第二,cast(... to date)
不采用格式模型 - 它仅依赖于您的会话 nls_date_format
参数,该参数与字符串的日期格式不匹配。 (尤其是样板文件,中间硬编码的 T,在 Oracle 中没有意义。)
您需要具有适当格式模型的 to_date()
。请注意硬编码字符串片段的处理(它们出现在格式模型中的双引号中)。
select to_date(date_registered, 'yyyy/mm/dd"T"hh24:mi:ss') as reg_date
from employee;
答案 1 :(得分:1)
在 Oracle 中,日期数据类型始终存储为 7 个字节,包括世纪、世纪年、月、日、小时、分钟和秒;因此,要求将具有年份到秒分量的内容转换为日期不需要您执行任何操作:
SELECT date_registered AS reg_date FROM employee
现在,如果您将 date_registered
存储为字符串数据类型而不是日期数据类型,那么您需要使用 TO_DATE
进行转换:
SELECT TO_DATE( date_registered, 'YYYY-MM-DD"T"HH24:MI:SS' ) AS reg_date
FROM employee
但是,您不应该这样做,您应该解决将日期存储为字符串而不是日期的潜在问题。可以通过转换列的数据类型来解决这个问题:
ALTER TABLE employee ADD ( date_registered2 DATE );
UPDATE employee
SET date_registered2 = TO_DATE( date_registered, 'YYYY-MM-DD"T"HH24:MI:SS' );
ALTER TABLE employee DROP COLUMN date_registered;
ALTER TABLE employee RENAME COLUMN date_registered2 TO date_registered;
(注意:下面的查询假设您已经“修复”了表,以便 date_registered
列具有日期数据类型;如果您不想这样做,则需要包括TO_DATE
转化也是如此。)
如果您希望输出是时间部分被截断回午夜的日期,则:
SELECT TRUNC( date_registered ) AS reg_date
FROM employee
(注意:显示的日期仍然有小时、分钟和秒部分,但它们在通过 TRUNC
后都为零。)
如果您希望它采用特定格式,而没有时间组件,则需要使用 TO_CHAR
将其输出为格式化字符串(因为日期数据类型没有关联的格式):
SELECT TO_CHAR( date_registered, 'DD/MM/YYYY' ) AS reg_date
FROM employee
db<>fiddle here