将 varchar/timestamp 列转换为日期字段
Convert varchar/timestamp col to Date field
我有一个 varchar2 数据类型字段 (lmp_date
),它可以 return null
或看起来像 timestamp
的值。将数据库 data_type
更改为 DATE
是不可能的,所以现在我需要将其转换为日期,但是使用此列的值 returns,我有一些问题。
lmp_date
的返回值 =
null
或 2021-06-11-00.00.00
需要的日期格式:MM/DD/YYYY
我试过cast
、convert
、substr+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_date
有 null
值的可能性,所以这不会成功
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
当您执行以下任一操作时:
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')
但只有当您混合使用一些有时间而有些没有的字符串值时,这才真正有用。 (结果日期总是有一个时间;它只是午夜。)如果你有不同格式的日期,那么它会变得有点复杂——部分原因是你不应该将日期存储为字符串。
我有一个 varchar2 数据类型字段 (lmp_date
),它可以 return null
或看起来像 timestamp
的值。将数据库 data_type
更改为 DATE
是不可能的,所以现在我需要将其转换为日期,但是使用此列的值 returns,我有一些问题。
lmp_date
的返回值 =
null
或 2021-06-11-00.00.00
需要的日期格式:MM/DD/YYYY
我试过cast
、convert
、substr+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_date
有 null
值的可能性,所以这不会成功
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
当您执行以下任一操作时:
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')
但只有当您混合使用一些有时间而有些没有的字符串值时,这才真正有用。 (结果日期总是有一个时间;它只是午夜。)如果你有不同格式的日期,那么它会变得有点复杂——部分原因是你不应该将日期存储为字符串。