将 varchar/timestamp 列转换为日期字段

Convert varchar/timestamp col to Date field

我有一个 varchar2 数据类型字段 (lmp_date),它可以 return null 或看起来像 timestamp 的值。将数据库 data_type 更改为 DATE 是不可能的,所以现在我需要将其转换为日期,但是使用此列的值 returns,我有一些问题。

lmp_date 的返回值 = null2021-06-11-00.00.00

需要的日期格式:MM/DD/YYYY

我试过castconvertsubstr+instr都没有用

ETA - 几个示例尝试(因为已经有 10+:

select order_no, to_date(lmp_date) lmp_date from table_a - 错误消息为 'ORA-01861: literal does not match format string'

select order_no, to_date(substr(lmp_date, 1, instr(lmp_date, '00' -15))) lmp_date from table_a - 因为 lmp_datenull 值的可能性,所以这不会成功

select order_no, cast(lmp_date as date) lmp_date from table_a - 与 'ORA-01861: literal does not match format string'

相同的错误消息

select order_no, to_date(lmp_date, 'YYYY-MM-DD') lmp_date from table_a - ORA-01830: 日期格式图片在转换整个输入字符串之前结束

尝试了很多,我只记得这些了

要将字符串转换为日期,请使用 the to_date() function 和合适的格式掩码:

to_date(lmp_date, 'YYYY-MM-DD-HH24:MI:SS')

格式模型元素为 in the documentation

其结果是日期数据类型,这是一种内部 7 字节表示形式。您的客户端或应用程序将格式化显示,这可能基于您的 NLS_DATE_FORMAT 设置,因此您可以修改它以更改显示所有日期;或使用 to_char() 将日期转换回字符串,例如:

to_char(to_date(lmp_date, 'YYYY-MM-DD-HH24:MI:SS'), 'MM/DD/YYYY')

虽然如果你想要它作为那个字符串,你可以只使用 substr() 和连接的字符串操作:

case when lmp_date is not null then
  substr(lmp_date, 6, 2) || '/' || substr(lmp_date, 9, 2) || '/' || substr(lmp_date, 1, 4)
end

db<>fiddle


当您执行以下任一操作时:

to_date(lmp_date)
cast(lmp_date as date)

这也取决于您的会话NLS_DATE_FORMAT;并且“文字与格式字符串不匹配”错误表明它与字符串不匹配,例如如果你有仍然默认的 'DD-MON-RR' 设置。如果您更改了该设置,它实际上会起作用——在您当前的会话中。 I've shown that here just for info. 但要为任何人工作,无论他们的会话设置如何,您应该使用 to_date() 和明确的格式掩码,并且不要依赖或假设任何特定于会话的内容。

你快到了:

to_date(lmp_date, 'YYYY-MM-DD')

“日期格式图片在转换整个输入字符串之前结束”消息再次告诉您出了什么问题 - 您的字符串继续超过 YYYY-MM-DD 元素。扩展格式掩码以匹配所有字符串,就像我在上面所做的那样,意味着它知道每个部分的含义。

如果您真的只对日期部分感兴趣,那么您可以剪掉字符串的末尾:

to_date(substr(lmp_date, 1, 10), 'YYYY-MM-DD')

但只有当您混合使用一些有时间而有些没有的字符串值时,这才真正有用。 (结果日期总是有一个时间;它只是午夜。)如果你有不同格式的日期,那么它会变得有点复杂——部分原因是你不应该将日期存储为字符串。