Oracle的学习心得和知识总结(七)|Oracle数据库Literals技术详解

注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:

1、参考书籍:《Oracle Database SQL Language Reference》
2、参考书籍:《PostgreSQL中文手册》
3、EDB Postgres Advanced Server User Guides,点击前往
4、AntDB 开源仓库,点击前往 或者 AntDB 本人gitee仓库,点击前往
5、PostgreSQL数据库仓库链接,点击前往
6、PostgreSQL中文社区,点击前往
7、Oracle数据库 Literals 官方文档说明,点击前往


1、本文内容全部来源于开源社区 GitHub和以上博主的贡献,本文也免费开源(可能会存在问题,评论区等待大佬们的指正)
2、本文目的:开源共享 抛砖引玉 一起学习
3、本文不提供任何资源 不存在任何交易 与任何组织和机构无关
4、大家可以根据需要自行 复制粘贴以及作为其他个人用途,但是不允许转载 不允许商用 (写作不易,还请见谅 💖)
5、本文仅适于从事于PostgreSQL数据库内核开发者和数据库爱好者,对普通读者而言难度较大 但对于希望从事于数据库内核开发的初学者来说,是一次机会十分难得的学习案例 💪
6、本文内容基于PostgreSQL14.2源码开发而成




本人博客严正声明

是这样的,熟悉在下的小伙伴们都知道 我写博客主要目的就是分享和学习总结。至于CSDN的排名 排名什么的,我并不是很在意!

  • 一来 很不喜欢标题党
  • 二来 更反感灌些水文
  • 三来 痛恨无下限抄袭

本人博客都是认认真真写的,结果在CSDN并没有什么的太大的名气 关注度什么的也不高!前些天 一位好心的粉丝私聊了在下,反而一名某平台的哥们儿 快把我的《PostgreSQL的学习心得和知识总结》都给照搬过去了,甚至一个字都不改(连同在下 都是只字不提 好歹稍微提一下呀)!!!

实在是太过分,后来经过(友好)协商,现已经全部删除了!

本人是做PostgreSQL内核开发的,深感当下学风不正 大家都很浮躁,一向踏踏实实深耕的并不是很多!因为写代码这件事情上,欺骗不了任何人!本本分分老老实实地写好代码做好学问十分不易,容不得掺沙子和造假!这里把我喜欢的一句话送给各位以共勉:

非淡泊无以明志,
非宁静无以致远!


文章快速说明索引

学习目标:

目的:最近瀚高开源数据库IvorySQL,其git仓库链接,点击前往 支持了Oracle数据库的 q/Q 转义功能,而且应我多位粉丝的请求 我打算之后详细地讨论一下瀚高这一版代码功能底层的实现原理!这里主要是学习以及介绍Oracle数据库 Literals 功能的注意事项等,基于PostgreSQL数据库的功能开发等之后 由新博客进行介绍和分享!


学习内容:(详见目录)

1、Oracle数据库的Literals技术


学习时间:

2022年04月29日 13:51:24


学习产出:

1、Oracle数据库 Literals 技术学习
2、CSDN 技术博客 1篇


注:下面我们所有的学习环境是Centos7+PostgreSQL14.2+Oracle11g+MySQL5.7

postgres=# select version();
                                   version                                   
-----------------------------------------------------------------------------
 PostgreSQL 14.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.1.0, 64-bit
(1 row)

postgres=#

#-----------------------------------------------------------------------------#

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE	11.2.0.1.0	Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL>

#-----------------------------------------------------------------------------#

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.19    |
+-----------+
1 row in set (0.06 sec)

mysql>

字面量的分类概述

术语字面量literal和常量值constant value是同义词,指的是固定数据值。例如,'JACK', 'BLUE ISLAND' '101'都是字符文字;5001 是一个数字文字。字符文字用单引号括起来,以便 Oracle 可以将它们与模式对象名称区分开来。

许多 SQL 语句和函数要求您指定字符和数字文字值。 您还可以将文字指定为表达式和条件的一部分。 您可以使用 'text' 表示法指定字符文字,使用 N'text' 表示法指定国家字符文字,以及使用整数或数字表示法指定数字文字,具体取决于文字的上下文。 这些符号的句法形式出现在后面的部分中。

要将日期时间或间隔数据类型指定为文字,您必须考虑数据类型中包含的任何可选精度。


今天学习的内容,如下:

  • 文本字面量
  • 数字文字
  • 日期时间文字
  • 区间文字

注:今天我们学习Literals的目的:着重学习 q/Q 转义部分,为后面介绍PostgreSQL兼容开发做铺垫!


Text Literals

只要string出现在本参考其他部分的表达式、条件、SQL 函数和 SQL 语句的语法中,就使用文本文字表示法指定值。此引用交替使用术语:text literal, character literal, string。 文本、字符和字符串文字总是用 单引号 括起来。 如果语法使用术语 char,那么您可以指定文本文字或解析为字符数据的另一个表达式。例如,hr.employees 表的 last_name 列。 当 char 出现在语法中时,不使用单引号。

文本文字或字符串的语法格式如下:
在这里插入图片描述
其中 N 或 n 指定使用国家字符集(NCHAR 或 NVARCHAR2 数据)的文字。 默认情况下,使用此表示法输入的文本在服务器使用时通过数据库字符集转换为国家字符集。 为避免在将文本文字转换为数据库字符集期间可能丢失数据,请将环境变量 ORA_NCHAR_LITERAL_REPLACE 设置为 TRUE。 这样做会在内部透明地替换 n' 并保留文本文字以供 SQL 处理。

在语法的顶部分支中:

  • c是用户字符集的任何成员。字面量中的单引号(')前必须有转义字符。若要表示文字中的一个单引号,请输入两个单引号
  • ' '是两个单引号,用于开始和结束文本文本

在语法的底部分支中:

  • Q或q表示将使用替代引用机制。此机制允许文本字符串使用范围广泛的分隔符
  • 最外面' '是两个单引号,分别位于开头和结尾quote_delimiter
  • c是用户字符集的任何成员。可以在由c字符组成的文本文本中包含引号(")。还可以包含quote_delimiter,只要它后面没有紧跟单引号即可
  • quote_delimiter是除空格、制表符和回车之外的任何单字节或多字节字符。quote_delimiter可以是单引号。但是,如果quote_delimiter出现在文本本身中,请确保它后面没有紧跟单引号
  • 如果开始的quote_delimiter[、{、<(,那么结束的quote_分隔符必须是相应的]、}、>)。在所有其他情况下,quote_delimiter的开头和结尾必须是相同的字符

文本文本具有CHARVARCHAR2数据类型的属性:

  • 在表达式和条件中,Oracle使用填充空白的比较语义来比较文本,就像它们具有CHAR数据类型一样
  • 如果初始化参数MAX_STRING_SIZE = STANDARD,则文本字面值的最大长度为4000字节,如果初始化参数MAX_STRING_SIZE = EXTENDED,则最大长度为32767字节

以下是一些有效的文本:

'Hello'
'ORACLE.dbs'
'Jackie''s raincoat'
'09-MAR-98'
N'nchar literal'

SQL> select 'Jackie''s raincoat' from dual;

'JACKIE''SRAINCOA
-----------------
Jackie's raincoat

SQL> select N'nchar literal' from dual;

N'NCHARLITERA
-------------
nchar literal

SQL>

下面是一些使用替代引用机制的有效文本(这是我们今天学习的重点):

SQL> select q'!name LIKE '%DBMS_%%'!' from dual;

Q'!NAMELIKE'%DBMS_%%
--------------------
name LIKE '%DBMS_%%'

SQL> select q'<'So,' she said, 'It's finished.'>' from dual;

Q'<'SO,'SHESAID,'IT'SFINISHED.'>
--------------------------------
'So,' she said, 'It's finished.'

SQL> select q'{SELECT * FROM employees WHERE last_name = 'Smith';}' from dual;

Q'{SELECT*FROMEMPLOYEESWHERELAST_NAME='SMITH';}'
--------------------------------------------------
SELECT * FROM employees WHERE last_name = 'Smith';

SQL> select nq'ï Ÿ1234 ï' from dual;
ERROR:
ORA-01756: quoted string not properly terminated


SQL> select q'ï Ÿ1234 ï' from dual;
ERROR:
ORA-01756: quoted string not properly terminated


SQL> select q'"name like '['"' from dual;

Q'"NAMELIKE'[
-------------
name like '['

SQL>

上面这两个报错的,如下解决即可:

[oracle@local64 ~]$ export NLS_LANG=american_america.AL32UTF8
[oracle@local64 ~]$ 
[oracle@local64 ~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 29 18:20:29 2022

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

SQL> conn /as sysdba
Connected.
SQL> 
SQL> select q'宋1234 宋' from dual;

Q'宋1
-----
1234

SQL> select nq'ï Ÿ1234 ï' from dual;

NQ'ÏŸ1234Ï'
----------------------------
 Ÿ1234

SQL> select q'ï Ÿ1234 ï' from dual;

Q'ÏŸ1234
--------
 Ÿ1234

SQL>

Numeric Literals

使用数字文字表示法来指定定点数和浮点数。

  • Integer Literals
  • NUMBER and Floating-Point Literals

整数文字:integer无论何时出现在本参考其他部分中描述的表达式、条件、SQL 函数和 SQL 语句中, 您都必须使用整数表示法来指定整数。其语法格式如下:
在这里插入图片描述
一个整数最多可以存储 38 位精度。以下是一些有效的整数:

7
+255

NUMBER 和 浮点文字:每当 number 或 n 出现在本参考其他部分的表达式、条件、SQL 函数和 SQL 语句中时,您必须使用数字或浮点表示法来指定值。其语法格式如下:
在这里插入图片描述
解释一下:

  • +- 表示正值或负值。 如果省略符号,则默认值为正值
  • 数字是 0、1、2、3、4、5、6、7、8 或 9 之一
  • e 或 E 表示该数字以科学计数法指定。 E 后面的数字指定指数。 指数的范围可以从 -130 到 125
  • f 或 F 表示该数字是 BINARY_FLOAT 类型的 32 位二进制浮点数
  • d 或 D 表示该数字是 BINARY_DOUBLE 类型的 64 位二进制浮点数。如果省略 f 或 F 和 d 或 D,则数字为 NUMBER 类型
  • 后缀 f (F) 和 d (D) 仅在浮点数文字中受支持,在要转换为 NUMBER 的字符串中不支持。 例如,如果 Oracle 需要一个 NUMBER,但遇到字符串 '9',则将字符串转换为数字 9。但是,如果 Oracle 遇到字符串 '9f',则转换失败并返回错误

NUMBER 类型的数字最多可以存储 38 位精度。如果文字需要比 NUMBERBINARY_FLOATBINARY_DOUBLE 提供的精度更高的精度,则 Oracle 会截断该值。如果文字的范围超出了 NUMBERBINARY_FLOATBINARY_DOUBLE 支持的范围,则 Oracle 会引发错误。

数字文字是 SQL 语法元素,对 NLS 设置不敏感。数字文字中的小数分隔符始终是句点 (.)。但是,如果在需要数值的地方指定了文本字面量,则文本字面量会以 NLS 敏感的方式隐式转换为数字。文本文字中包含的小数分隔符必须是使用初始化参数 NLS_NUMERIC_CHARACTERS 建立的分隔符。 Oracle 建议您在 SQL 脚本中使用数字文字,以使它们独立于 NLS 环境工作。

以下示例说明了数字文字和文本文字中小数分隔符的行为。这些示例假定您已使用以下语句将逗号 (,) 作为当前会话的 NLS 小数分隔符:

SQL> SELECT 2 * 1.23, 3 * '2,34' FROM DUAL;
SELECT 2 * 1.23, 3 * '2,34' FROM DUAL
                     *
ERROR at line 1:
ORA-01722: invalid number


SQL> ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.';

Session altered.

SQL> SELECT 2 * 1.23, 3 * '2,34' FROM DUAL;

    2*1.23   3*'2,34'
---------- ----------
      2,46       7,02

SQL>

前面的语句还建立了句点 (.) 作为 NLS 组分隔符,但这与这些示例无关。

如上示例在数字文字 1.23 中使用所需的小数分隔符 (.),在文本文字 '2,34' 中使用已建立的 NLS 小数分隔符 (,)。 文本文字被转换为数值 2.34,并使用逗号作为小数分隔符显示输出。

下一个示例显示逗号不被视为数字文字的一部分。 相反,逗号被视为两个数字表达式列表中的分隔符:2*123。如下:

SQL> SELECT 2 * 1,23 FROM DUAL;

       2*1         23
---------- ----------
         2         23

SQL>

下一个示例显示文本文字中的小数分隔符必须与 NLS 小数分隔符匹配,才能使隐式文本到数字的转换成功。 以下语句失败,因为小数分隔符 (.) 与已建立的 NLS 小数分隔符 (,) 不匹配:

SQL> conn /as sysdba
Connected.
SQL> 
SQL> SELECT 3 * '2.34' FROM DUAL;

  3*'2.34'
----------
      7.02

SQL> ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.';

Session altered.

SQL> SELECT 3 * '2.34' FROM DUAL;
SELECT 3 * '2.34' FROM DUAL
           *
ERROR at line 1:
ORA-01722: invalid number


SQL>

以下是一些有效的 NUMBER 字面量:

25
+6.34
0.5
25e-03
-1

以下是一些有效的浮点数文字:

25f
+6.34F
0.5d
-1D

在无法将值表示为数字文字的情况下,您还可以使用以下提供的浮点文字。Table Floating-Point Literals,如下:

LiteralMeaningExample
binary_float_nanA value of type BINARY_FLOAT for which the condition IS NAN is trueSQL1
binary_float_infinitySingle-precision positive infinitySQL2
binary_double_nanA value of type BINARY_DOUBLE for which the condition IS NAN is trueSQL3
binary_double_infinityDouble-precision positive infinitySQL4
# sql1
SELECT COUNT(*) 
  FROM employees 
  WHERE TO_BINARY_FLOAT(commission_pct)
     != BINARY_FLOAT_NAN;
     
# sql2
SELECT COUNT(*) 
  FROM employees 
  WHERE salary < BINARY_FLOAT_INFINITY;
  
# sql3
SELECT COUNT(*) 
  FROM employees 
  WHERE TO_BINARY_FLOAT(commission_pct)
     != BINARY_FLOAT_NAN;
     
# sql4
SELECT COUNT(*) 
  FROM employees 
  WHERE salary < BINARY_DOUBLE_INFINITY;

Datetime Literals

Oracle 数据库支持四种日期时间数据类型:DATETIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE

  • Date Literals
  • TIMESTAMP Literals
  • TIMESTAMP WITH TIME ZONE Literals
  • TIMESTAMP WITH LOCAL TIME ZONE Literals

日期文字:您可以将 DATE 值指定为字符串文字,也可以使用 TO_DATE 函数将字符或数值转换为日期值。 DATE 文字是 Oracle 数据库接受 TO_DATE 表达式代替字符串文字的唯一情况。

要将 DATE 值指定为文字,您必须使用公历。 您可以指定 ANSI 文字,如下例所示:

SQL> select DATE '1998-12-25' from dual;

DATE'1998-12-25'
-------------------
1998-12-25 00:00:00

SQL>

ANSI 日期文字不包含时间部分,并且必须以'YYYY-MM-DD'格式指定。 或者,您可以指定 Oracle 日期值,如下例所示:

SQL> select TO_DATE('98-DEC-25 17:30','YY-MON-DD HH24:MI') from dual;

TO_DATE('98-DEC-251
-------------------
2098-12-25 17:30:00

SQL>

Oracle DATE 值的默认日期格式由初始化参数 NLS_DATE_FORMAT 指定。此示例日期格式包括一个两位数的月份日期、月份名称的缩写、年份的最后两位数字和 24 小时时间指定。

在日期表达式中使用默认日期格式的字符值时,Oracle 会自动将它们转换为日期值。

如果您指定不带时间组件的日期值,则默认时间为午夜(24 小时制和 12 小时制时间分别为 00:00:00 或 12:00:00)。如果您指定一个不带日期的日期值,则默认日期是当月的第一天。

Oracle DATE 列始终包含日期和时间字段。因此,如果您查询 DATE 列,则必须在查询中指定时间字段或确保将 DATE 列中的时间字段设置为午夜。否则,Oracle 可能不会返回您期望的查询结果。您可以使用 TRUNC 日期函数将时间字段设置为午夜,或者您可以在查询中包含大于或小于条件而不是相等或不等条件。

下面是一些假设表 my_table 具有数字列 row_num 和 DATE 列 datecol 的示例:

SQL> create table my_table (row_num int, datecol date);

Table created.

SQL> INSERT INTO my_table VALUES (1, SYSDATE);

1 row created.

SQL> INSERT INTO my_table VALUES (2, TRUNC(SYSDATE));

1 row created.

SQL> SELECT * FROM my_table;

   ROW_NUM DATECOL
---------- -------------------
         1 2022-05-03 14:55:17
         2 2022-05-03 00:00:00

SQL> SELECT * FROM my_table WHERE datecol > TO_DATE('02-MAY-22', 'DD-MON-YY');

   ROW_NUM DATECOL
---------- -------------------
         1 2022-05-03 14:55:17
         2 2022-05-03 00:00:00

SQL> SELECT * FROM my_table WHERE datecol = TO_DATE('03-MAY-22','DD-MON-YY');

   ROW_NUM DATECOL
---------- -------------------
         2 2022-05-03 00:00:00

SQL>

如果您知道 DATE 列的时间字段设置为午夜,那么您可以查询您的 DATE 列,如前面的示例所示,或使用 DATE 文字:

SQL> SELECT * FROM my_table WHERE datecol = DATE '2022-05-03';

   ROW_NUM DATECOL
---------- -------------------
         2 2022-05-03 00:00:00

SQL>

但是,如果 DATE 列包含非午夜的值,则您必须过滤掉查询中的时间字段才能获得正确的结果。 例如:

SQL> SELECT * FROM my_table WHERE TRUNC(datecol) = DATE '2022-05-03';

   ROW_NUM DATECOL
---------- -------------------
         1 2022-05-03 14:55:17
         2 2022-05-03 00:00:00

SQL>

Oracle 将 TRUNC 函数应用于查询中的每一行,因此如果您确保数据中时间字段的午夜值,性能会更好。 要确保将时间字段设置为午夜,请在插入和更新期间使用以下方法之一:

  • Use the TO_DATE function to mask out the time fields:
SQL> delete from my_table;

2 rows deleted.

SQL> INSERT INTO my_table VALUES (3, TO_DATE('3-OCT-2002','DD-MON-YYYY'));

1 row created.

SQL> select * from my_table;

   ROW_NUM DATECOL
---------- -------------------
         3 2002-10-03 00:00:00

SQL>
  • Use the DATE literal:
SQL> INSERT INTO my_table VALUES (4, '03-OCT-02');

1 row created.

SQL> select * from my_table;

   ROW_NUM DATECOL
---------- -------------------
         3 2002-10-03 00:00:00
         4 0003-10-02 00:00:00

SQL>
  • Use the TRUNC function:
SQL> INSERT INTO my_table VALUES (5, TRUNC(SYSDATE));

1 row created.

SQL> select * from my_table;

   ROW_NUM DATECOL
---------- -------------------
         3 2002-10-03 00:00:00
         4 0003-10-02 00:00:00
         5 2022-05-03 00:00:00

SQL>

日期函数 SYSDATE 返回当前系统日期和时间。 函数 CURRENT_DATE 返回当前会话日期。 有关 SYSDATE、TO_* 日期时间函数和默认日期格式的信息,请参阅日期时间函数。

注:这部分内容可以参见本人之前的博客:Oracle的学习心得和知识总结(三)|Oracle数据库重要函数详解 单行函数(一)(建议收藏 持续更新…),点击前往


TIMESTAMP 文字:TIMESTAMP 数据类型存储年、月、日、小时、分钟和秒以及小数秒值。 当您将 TIMESTAMP 指定为文字时,fractional_seconds_precision 值可以是最多 9 位的任意位数,如下所示:

SQL> select TIMESTAMP '1997-01-31 09:26:50.124' from dual;

TIMESTAMP'1997-01-3109:26:50.124'
---------------------------------------------------------------------------
31-JAN-97 09.26.50,124000000 AM

SQL>

TIMESTAMP WITH TIME ZONE 文字:TIMESTAMP WITH TIME ZONE 数据类型是 TIMESTAMP 的变体,包括时区区域名称或时区偏移量。 当您将 TIMESTAMP WITH TIME ZONE 指定为文字时,fractional_seconds_precision 值可以是最多 9 位的任意位数。例如:

SQL> select TIMESTAMP '1997-01-31 09:26:56.66 +02:00' from dual;

TIMESTAMP'1997-01-3109:26:56.66+02:00'
---------------------------------------------------------------------------
31-JAN-97 09.26.56,660000000 AM +02:00

SQL>

如果两个 TIMESTAMP WITH TIME ZONE 值在 UTC 中表示相同的时刻,则它们被认为是相同的,而与存储在数据中的 TIME ZONE 偏移量无关。 例如:

SQL> select TIMESTAMP '1999-04-15 8:00:00 -8:00' from dual;

TIMESTAMP'1999-04-158:00:00-8:00'
---------------------------------------------------------------------------
15-APR-99 08.00.00,000000000 AM -08:00

SQL>
SQL> select TIMESTAMP '1999-04-15 11:00:00 -5:00' from dual;

TIMESTAMP'1999-04-1511:00:00-5:00'
---------------------------------------------------------------------------
15-APR-99 11.00.00,000000000 AM -05:00

SQL>

太平洋标准时间上午 8:00 与东部标准时间上午 11:00 相同。

您可以将 UTC 偏移量替换为 TZR(时区区域名称)格式元素。 例如,以下示例与前面的示例具有相同的值:

SQL> select TIMESTAMP '1999-04-15 8:00:00 US/Pacific' from dual;

TIMESTAMP'1999-04-158:00:00US/PACIFIC'
---------------------------------------------------------------------------
15-APR-99 08.00.00,000000000 AM US/PACIFIC

SQL>

为了消除夏令时切换时边界情况的歧义,请同时使用 TZR 和相应的 TZD 格式元素。 以下示例确保前面的示例将返回夏令时值:

SQL> select TIMESTAMP '1999-10-29 01:30:00 US/Pacific PDT' from dual;

TIMESTAMP'1999-10-2901:30:00US/PACIFICPDT'
---------------------------------------------------------------------------
29-OCT-99 01.30.00,000000000 AM US/PACIFIC

SQL>

您还可以使用 datetime 表达式表示时区偏移:

SQL> SELECT TIMESTAMP '2009-10-29 01:30:00' AT TIME ZONE 'US/Pacific' FROM DUAL;

TIMESTAMP'2009-10-2901:30:00'ATTIMEZONE'US/PACIFIC'
---------------------------------------------------------------------------
29-OCT-09 01.30.00,000000000 AM US/PACIFIC

SQL>

如果您不添加 TZD 格式元素,并且日期时间值不明确,那么如果您将 ERROR_ON_OVERLAP_TIME 会话参数设置为 TRUE,则 Oracle 会返回错误。 如果该参数设置为 FALSE,则 Oracle 将不明确的日期时间解释为指定区域中的标准时间。


带有本地时区文字的时间戳:TIMESTAMP WITH LOCAL TIME ZONE 数据类型与 TIMESTAMP WITH TIME ZONE 的不同之处在于,存储在数据库中的数据被规范化为数据库时区。 时区偏移不存储为列数据的一部分。 TIMESTAMP WITH LOCAL TIME ZONE 没有文字。 相反,您可以使用任何其他有效的日期时间文字来表示此数据类型的值。 下表显示了可用于将值插入到 TIMESTAMP WITH LOCAL TIME ZONE 列中的一些格式,以及查询返回的相应值。

Table TIMESTAMP WITH LOCAL TIME ZONE Literals,如下:

Value Specified in INSERT StatementValue Returned by Query
‘19-FEB-2004’19-FEB-2004.00.00.000000 AM
SYSTIMESTAMP19-FEB-04 02.54.36.497659 PM
TO_TIMESTAMP(‘19-FEB-2004’, ‘DD-MON-YYYY’)19-FEB-04 12.00.00.000000 AM
SYSDATE19-FEB-04 02.55.29.000000 PM
TO_DATE(‘19-FEB-2004’, ‘DD-MON-YYYY’)19-FEB-04 12.00.00.000000 AM
TIMESTAMP’2004-02-19 8:00:00 US/Pacific’19-FEB-04 08.00.00.000000 AM

请注意,如果指定的值不包括时间分量(显式或隐式),则返回的值默认为午夜。


Interval Literals

间隔字面量指定时间段。 您可以按年和月,或按天、小时、分钟和秒来指定这些差异。 Oracle 数据库支持两种类型的间隔文字,YEAR TO MONTHDAY TO SECOND

每种类型都包含一个前导字段,并且可能包含一个尾随字段。 前导字段定义了被测量的日期或时间的基本单位。 尾随字段定义所考虑的基本单位的最小增量。 例如,YEAR TO MONTH 间隔考虑了距最近月份的年份间隔。 DAY TO MINUTE 间隔考虑到最近分钟的天间隔。

如果您有数字形式的日期数据,则可以使用 NUMTOYMINTERVALNUMTODSINTERVAL 转换函数将数字数据转换为区间值。

区间文字主要用于分析函数。


INTERVAL YEAR TO MONTH:使用以下语法指定 YEAR TO MONTH 间隔文字:
在这里插入图片描述
解释一下:

  • 'integer [-integer]' 为文字的前导和可选尾随字段指定整数值。如果前导字段是 YEAR,尾随字段是 MONTH,则月份字段的整数值范围是 0 到 11
  • precision是前导字段中的最大位数。 前导字段精度的有效范围是 0 到 9,默认值为 2

领先领域的限制:如果您指定尾随字段,则它的重要性必须低于前导字段。 例如,INTERVAL '0-1' MONTH TO YEAR 无效。以下 INTERVAL YEAR TO MONTH 文字表示 123 年 2 个月的间隔:

SQL> select INTERVAL '123-2' YEAR(3) TO MONTH from dual;

INTERVAL'123-2'YEAR(3)TOMONTH
---------------------------------------------------------------------------
+123-02

SQL>

下面是其他形式的文字示例,包括一些缩写版本。Table Forms of INTERVAL YEAR TO MONTH Literals,如下:

Form of Interval LiteralInterpretation
INTERVAL ‘123-2’ YEAR(3) TO MONTHAn interval of 123 years, 2 months. You must specify the leading field precision if it is greater than the default of 2 digits.
INTERVAL ‘123’ YEAR(3)An interval of 123 years 0 months.
INTERVAL ‘300’ MONTH(3)An interval of 300 months.
INTERVAL ‘4’ YEARMaps to INTERVAL ‘4-0’ YEAR TO MONTH and indicates 4 years.
INTERVAL ‘50’ MONTHMaps to INTERVAL ‘4-2’ YEAR TO MONTH and indicates 50 months or 4 years 2 months.
INTERVAL ‘123’ YEARReturns an error, because the default precision is 2, and ‘123’ has 3 digits.

您可以将一个 INTERVAL YEAR TO MONTH 文字添加或减去另一个文字,以生成另一个 INTERVAL YEAR TO MONTH 文字。 例如:

INTERVAL '5-3' YEAR TO MONTH + INTERVAL'20' MONTH = 
INTERVAL '6-11' YEAR TO MONTH

SQL> select INTERVAL '5-3' YEAR TO MONTH + INTERVAL'20' MONTH from dual;

INTERVAL'5-3'YEARTOMONTH+INTERVAL'20'MONTH
---------------------------------------------------------------------------
+000000006-11

SQL> select INTERVAL '6-11' YEAR TO MONTH from dual;

INTERVAL'6-11'YEARTOMONTH
---------------------------------------------------------------------------
+06-11

SQL>

INTERVAL DAY TO SECOND:使用以下语法指定 DAY TO SECOND 间隔文字,如下:
在这里插入图片描述
解释一下:

  • integer指定天数。 如果此值包含的位数多于前导精度指定的数字,则 Oracle 将返回错误
  • time_exprHH[:MI[:SS[.n]]]MI[:SS[.n]]SS[.n] 格式指定时间,其中 n 指定秒的小数部分。 如果 n 包含的位数多于 fractional_seconds_precision 指定的数字,则 n 将四舍五入为 fractional_seconds_precision 值指定的位数。 仅当前导字段为 DAY 时,才可以在整数和空格之后指定 time_expr
  • leading_precision 是前导字段中的位数。 可接受的值为 0 到 9。默认值为 2
  • fractional_seconds_precision 是 SECOND 日期时间字段的小数部分的位数。 可接受的值为 1 到 9。默认值为 6

领先领域的限制:如果您指定尾随字段,则它的重要性必须低于前导字段。 例如,INTERVAL MINUTE TO DAY 无效。 由于此限制,如果 SECOND 是前导字段,则间隔文字不能有任何尾随字段。

尾随字段的有效值范围如下:

  • HOUR: 0 to 23
  • MINUTE: 0 to 59
  • SECOND: 0 to 59.999999999

以下是 INTERVAL DAY TO SECOND 文字的各种形式的示例,包括一些缩写版本。Table Forms of INTERVAL DAY TO SECOND Literals,如下:

Form of Interval LiteralInterpretation
INTERVAL ‘4 5:12:10.222’ DAY TO SECOND(3)4 days, 5 hours, 12 minutes, 10 seconds, and 222 thousandths of a second.
INTERVAL ‘4 5:12’ DAY TO MINUTE4 days, 5 hours and 12 minutes.
INTERVAL ‘400 5’ DAY(3) TO HOUR400 days 5 hours.
INTERVAL ‘400’ DAY(3)400 days.
INTERVAL ‘11:12:10.2222222’ HOUR TO SECOND(7)11 hours, 12 minutes, and 10.2222222 seconds.
INTERVAL ‘11:20’ HOUR TO MINUTE11 hours and 20 minutes.
INTERVAL ‘10’ HOUR10 hours.
INTERVAL ‘10:22’ MINUTE TO SECOND10 minutes 22 seconds.
INTERVAL ‘10’ MINUTE10 minutes.
INTERVAL ‘4’ DAY4 days.
INTERVAL ‘25’ HOUR25 hours.
INTERVAL ‘40’ MINUTE40 minutes.
INTERVAL ‘120’ HOUR(3)120 hours.
INTERVAL ‘30.12345’ SECOND(2,4)30.1235 seconds. The fractional second ‘12345’ is rounded to ‘1235’ because the precision is 4.

您可以从另一个 DAY TO SECOND 文字中添加或减去一个 DAY TO SECOND 间隔文字。 例如:

INTERVAL'20' DAY - INTERVAL'240' HOUR = INTERVAL'10-0' DAY TO SECOND

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:猿与汪的秘密 设计师:我叫白小胖 返回首页
评论

打赏作者

孤傲小二~阿沐

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值