Oracle Timestamp类型
在本教程中将学习Oracle TIMESTAMP
数据类型以及如何在Oracle数据库中有效处理TIMESTAMP
数据。
Oracle TIMESTAMP数据类型简介
TIMESTAMP
数据类型用于存储日期和时间数据,包括年,月,日,时,分和秒。
另外,它存储小数秒,它不是由DATE数据类型存储的。
要定义TIMESTAMP
列,请使用以下语法:
column_name TIMESTAMP[(fractional_seconds_precision)]
fractional_seconds_precision
指定SECOND
字段小数部分的位数。它的范围从0
到9
,这意味着可以使用TIMESTAMP
数据类型来存储到纳秒的精度。
如果省略fractional_seconds_precision
,则默认为6
。
以下表达式说明了如何定义TIMESTAMP
列:
...
started_at TMESTAMP(2),
...
在此示例中,started_at
列是一个TIMESTAMP
列,其分数秒精度设置为微秒。
Oracle TIMESTAMP文字
要指定TIMESTAMP
文字,请使用以下格式:
TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.FF'
以下示例说明了TIMESTAMP
文字:
TIMESTAMP '1999-12-31 23:59:59.10'
有关如何构造格式字符串的详细信息,请查看Oracle日期格式。
Oracle TIMESTAMP示例
首先,创建一个名为logs
的新表,其中包含一个TIMESTAMP
列用于演示。
CREATE TABLE logs (
log_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
message VARCHAR(2) NOT NULL,
logged_at TIMESTAMP (2) NOT NULL,
PRIMARY KEY (log_id)
);
其次,将新行插入到logs
表中:
INSERT INTO logs (
message,
logged_at
)
VALUES (
'Invalid username/password for root user',
LOCALTIMESTAMP(2)
);
INSERT INTO logs (
message,
logged_at
)
VALUES (
'User root logged in successfully',
LOCALTIMESTAMP(2)
);
在这个例子中,使用LOCALTIMESTAMP(2)
函数中得到当前的本地时间戳,其精确度秒为微秒,并将该值插入到logs
表的logs_at
列中。
第三,从日志表中查询TIMESTAMP数据:
SELECT log_id,
message,
logged_at
FROM logs;
执行上面查询语句,得到下面结果 -
格式化TIMESTAMP值
要更改TIMESTAMP
值的输出,可以使用TO_CHAR()
函数,将TIMESTAMP
值或列的名称作为第一个参数,将格式字符串作为第二个参数。
以下语句使用TO_CHAR()
函数来格式化logged_at
列中的值:
SELECT message,
TO_CHAR(logged_at, 'MONTH DD, YYYY "at" HH24:MI')
FROM logs;
执行上面查询语句,得到下面结果 -
提取TIMESTAMP组件
要提取TIMESTAMP
组件(如年,月,日,小时,分钟和秒),请使用EXTRACT()
函数:
EXTRACT( component FROM timestamp);
如以下面的语句示例:
SELECT
message,
EXTRACT(year FROM logged_at) year,
EXTRACT(month FROM logged_at) month,
EXTRACT(day FROM logged_at) day,
EXTRACT(hour FROM logged_at) hour,
EXTRACT(minute FROM logged_at) minute,
EXTRACT(second FROM logged_at) second
FROM
logs;
注意到NLS_DATE_LANGUAGE
参数决定日期名称(Thursday),月份名称(August)以及TIMESTAMP
缩写(THU
,AUG
)的语言。
默认的TIMESTAMP格式
当字符类型的值被转换为TIMESTAMP
数据类型时,Oracle使用NLS_TIMESTAMP_FORMAT
参数来控制默认时间戳格式。
以下语句返回Oracle数据库系统中当前的默认时间戳格式:
SELECT
value
FROM
V$NLS_PARAMETERS
WHERE
parameter = 'NLS_TIMESTAMP_FORMAT';
执行上面查询语句,将得到以下结果 -
DD-MON-RR HH.MI.SSXFF AM
例如,假设要将新行以logs_attane
值插入到logs
表中,则使用TO_TIMESTAMP()
函数将字符串转换为TIMESTAMP
值,如下所示:
INSERT INTO logs (
message,
logged_at
)
VALUES (
'Test default Oracle timestamp format',
TO_TIMESTAMP('03-AUG-17 11:20:30.45 AM')
);
请注意,时间戳值 - '03-AUG-17 11:20:30.45 AM'
遵循标准时间戳格式。
下面来验证结果:
SELECT
log_id, message, logged_at
FROM
logs;
执行上面示例代码,得到以下结果 -
如果想使用其他时间戳格式而不是默认格式,则可以使用ALTER SESSION SET
语句来执行此操作。
在本教程中,您已经了解了Oracle TIMESTAMP
数据类型以及如何有效地处理时间戳。