【发布时间】:2015-03-06 14:15:52
【问题描述】:
我有包含值201503061500389804 的 ID 字段。时间戳在此 ID 中给出。 ID 值的格式如下:yyyyMMddhhmmss。
例如 201503061500389804 = 2015-03-06 15:00:38。不需要最后 4 位数字。我想从 ID 中提取日期和时间并将其保存在新列中,例如 EVENT_DATE。但是没有找到任何方法。
【问题讨论】:
我有包含值201503061500389804 的 ID 字段。时间戳在此 ID 中给出。 ID 值的格式如下:yyyyMMddhhmmss。
例如 201503061500389804 = 2015-03-06 15:00:38。不需要最后 4 位数字。我想从 ID 中提取日期和时间并将其保存在新列中,例如 EVENT_DATE。但是没有找到任何方法。
【问题讨论】:
如果 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));
那么您不必担心将值设置为插入的一部分或通过触发器设置,它会自动出现。
【讨论】:
使用to_date()。我认为这是格式字符串:
select to_date(substr(id, 1, 14), 'YYYYMMDDHH24MISS')
【讨论】: