Oracle 将时间戳转换为日期

时间:2021-02-23 05:14:52

标签: sql oracle

我有这样的约会:

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

2 个答案:

答案 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