DATE 和 TIMESTAMP 列没有任何固有的可读格式。这些值存储在 Oracle 自己的内部表示中,与人类可读的日期或时间没有相似之处。在检索或显示值时,您可以使用to_char() 将其转换为您想要的任何格式。
DATE 和 TIMESTAMP 都具有日期和时间组件(使用 DATE 精确到秒,使用 TIMESTAMP 精确到小数秒;加上扩展数据类型的时区信息),您不应尝试将它们分别存储为两列。拥有一栏,随时提取您需要的信息;要从单个列中获取信息,但可以拆分为两个字段:
select to_char(KPI_START, 'dd/mm/yyyy') as KPI_START_DATE,
to_char(KPI_START, 'hh24:mi:ss') as KPI_START_TIME
但您通常还是希望两者在一起:
select to_char(KPI_START, 'dd/mm/yyyy hh24:mi:ss')
还要注意 'hh24' 格式模型获取 24 小时制时间;否则你不会看到凌晨 3 点和下午 3 点之间有任何区别
您可以在任一类型的列中存储一个值,并将时间设置为午夜,但它仍然有一个时间组件 - 它只是午夜。您不能在任何一种类型的列中仅使用时间组件存储值 - 它也必须具有日期。您可以将其设为名义日期并忽略它,但我从未见过这样做的正当理由 - 您在两列中浪费存储空间,并使搜索和比较值变得更加困难。如果您不指定一个日期(当月的第一天),Oracle 甚至会提供一个默认日期。但该值始终同时包含日期和时间部分:
create table KPI_DEFINITION (KPI_START date);
insert into KPI_DEFINITION (KPI_START)
values (to_date('27/01/2015', 'DD/MM/YYYY'));
insert into KPI_DEFINITION (KPI_START)
values (to_date('12:41:57', 'HH24:MI:SS'));
select to_char(KPI_START, 'YYYY-MM-DD HH24:MI:SS') from KPI_DEFINITION;
TO_CHAR(KPI_START,'YYYY-MM-DDHH24:MI:SS')
-----------------------------------------
2015-01-27 00:00:00
2015-01-01 12:41:57
您的用户应该插入一个日期和时间都为一个的值:
insert into KPI_DEFINITION (KPI_START)
values (to_date('27/01/2015 12:41:57', 'DD/MM/YYYY HH24:MI:SS'));
select to_char(KPI_START, 'YYYY-MM-DD HH24:MI:SS') from KPI_DEFINITION;
TO_CHAR(KPI_START,'YYYY-MM-DDHH24:MI:SS')
-----------------------------------------
2015-01-27 12:41:57
您也可以使用date or timestamp literals,如果使用to_date(),您应该始终指定完整格式 - 不要依赖 NLS 设置,因为其他用户可能会有所不同。