从ID中提取日期和时间

时间:2015-03-06 14:15:53

标签: sql oracle date time

我的ID字段包含值201503061500389804。时间戳在此ID中给出。 ID值的格式如下:yyyyMMddhhmmss。 例如,201503061500389804 = 2015-03-06 15:00:38。最后4位数字不需要。我想从ID中提取日期和时间,并将其保存在新列中,例如EVENT_DATE。但没有找到任何办法。

2 个答案:

答案 0 :(得分:2)

如果ID代表时间戳,您可以将最后四位数字包括为小数秒 - 如果这是他们所代表的 - 使用to_timestamp()代替to_date()

select to_timestamp('201503061500389804',
  'YYYYMMDDHH24MISSFF4') as event_timestamp
from dual;

EVENT_TIMESTAMP           
--------------------------
2015-03-06 15:00:38.980400 

如果您不希望保留小数秒,则可以将其强制转换为日期:

select cast(to_timestamp('201503061500389804',
  'YYYYMMDDHH24MISSFF4') as date) as event_date
from dual;

EVENT_DATE         
-------------------
2015-03-06 15:00:38 

或修剪最后四位数并使用to_date()

select to_date(substr('201503061500389804', 1, 14),
  'YYYYMMDDHH24MISS') as event_date
from dual;

EVENT_DATE         
-------------------
2015-03-06 15:00:38 

你说你想把它保存在一个新专栏中;如果您使用11g或更高版本,则可以使用虚拟列进行此操作:

alter table your_table add event_date date generated always as
  (to_date(substr(to_char(id), 1, 14), 'YYYYMMDDHH24MISS'));

alter table your_table add event_date date generated always as
  (cast(to_timestamp(to_char(id), 'YYYYMMDDHH24MISSFF4') as date));

然后您不必担心将值设置为插入的一部分或通过触发器,它将自动存在。

答案 1 :(得分:1)

使用to_date()。我认为这是格式字符串:

select to_date(substr(id, 1, 14), 'YYYYMMDDHH24MISS')