从 ID 中提取日期和时间

Extract date and time from ID

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

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

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

如果 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 

或 trim 关闭最后四位数字并使用 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));

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