将字符插入日期列

时间:2018-07-26 08:20:14

标签: sql oracle date

我有一个日期栏。

select RETAIL_ACQUISITION_DTTM from XXXXX.TABLE_2348

13/07/2018

我要选择返回的值,如下所示,

2018-07-13T00:00:00

因此必须将日期显示为YYYY-MM-DD,然后输入T,然后显示HH24:MI:SS

2 个答案:

答案 0 :(得分:4)

您需要使用与实际字符串值匹配的格式模型将字符串(为什么以字符串形式存储?)转换为日期:

to_date(RETAIL_ACQUISITION_DTTM, 'DD/MM/YYYY')

该格式模型有误,这就是为什么您的结果获得0013年的原因。

然后,您可以使用to_char()将日期转换回字符串,并可以使用T这样的格式模型将固定的'YYYY-MM-DD"T"HH24:MI:SS'嵌入为带双引号的字符文字:

with TABLE_2348 (RETAIL_ACQUISITION_DTTM) as (
  select '13/07/2018' from dual
)
select to_char(to_date(RETAIL_ACQUISITION_DTTM, 'DD/MM/YYYY'),
  'YYYY-MM-DD"T"HH24:MI:SS') as RETAIL_ACQUISITION_DTTM
from XXXXX.TABLE_2348;

RETAIL_ACQUISITION_
-------------------
2018-07-13T00:00:00

您还可以忽略它是一个日期,并使用字符串操作:

with TABLE_2348 (RETAIL_ACQUISITION_DTTM) as (
  select '13/07/2018' from dual
)
select substr(RETAIL_ACQUISITION_DTTM, 7, 4)
  || '-' || substr(RETAIL_ACQUISITION_DTTM, 4, 2)
  || '-' ||substr(RETAIL_ACQUISITION_DTTM, 1, 2)
  || 'T00:00:00' as RETAIL_ACQUISITION_DTTM
from XXXXX.TABLE_2348;

RETAIL_ACQUISITION_
-------------------
2018-07-13T00:00:00

如果该列实际上是日期而不是字符串,那么您正在执行不必要的转换,包括依赖于NLS设置的隐式转换,并且如果该时间不是午夜,那么您将失去该值的原始时间:

alter session set nls_date_format = 'DD-MON-RR';

with TABLE_2348 (RETAIL_ACQUISITION_DTTM) as (
  select to_date('2018-07-13 12:34:56', 'YYYY-MM-DD HH24:MI:SS') from dual
)
select to_char(to_date(RETAIL_ACQUISITION_DTTM, 'YYYY-MM-DD-HH24:MI:SS'),
  'YYYY-MM-DD HH24:MI:SS') as RETAIL_ACQUISITION_DTTM from XXXXX.TABLE_2348;

RETAIL_ACQUISITION_
-------------------
0013-07-20 18:00:00

这真的是在做

to_char(
  to_date(
    to_char(
      RETAIL_ACQUISITION_DTTM,
      'DD-MON-RR'),     ---- from your session NLS_DATE_FORMAT setting
    'YYYY-MM-DD-HH24:MI:SS'),
  'YYYY-MM-DD HH24:MI:SS')

如果您跳到其他步骤,则可以直接设置日期格式:

with TABLE_2348 (RETAIL_ACQUISITION_DTTM) as (
  select to_date('2018-07-13 12:34:56', 'YYYY-MM-DD HH24:MI:SS') from dual
)
select to_char(RETAIL_ACQUISITION_DTTM,
  'YYYY-MM-DD"T"HH24:MI:SS') as RETAIL_ACQUISITION_DTTM
from XXXXX.TABLE_2348;

RETAIL_ACQUISITION_
-------------------
2018-07-13T12:34:56

它也不依赖于您的NLS设置,因此,如果它在具有不同设置的另一个会话中运行,也不会以有趣的方式中断。

答案 1 :(得分:0)

如果日期类型为sysdate,请用您的列名替换。

使用单个to_char:

select to_char(sysdate,'--YYYY-MM-DD"T"hh24:mi:ss') from dual;

使用两个to_char和串联进行简化。

select to_char(sysdate,'--'||'YYYY-MM-DD')||'T'||to_char(sysdate,'hh24:mi:ss') from dual; -- 13/07/2018
select '--'||to_char(sysdate,'YYYY-MM-DD')||'T'||to_char(sysdate,'hh24:mi:ss') from dual; -- 13/07/2018