Oracle的学习心得和知识总结(七)|Oracle数据库Literals技术详解_oracle literal_chars-程序员宅基地

技术标签: Oracle的学习心得和知识总结  oracle  postgresql  数据库  

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

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,如下:

Literal Meaning Example
binary_float_nan A value of type BINARY_FLOAT for which the condition IS NAN is true SQL1
binary_float_infinity Single-precision positive infinity SQL2
binary_double_nan A value of type BINARY_DOUBLE for which the condition IS NAN is true SQL3
binary_double_infinity Double-precision positive infinity SQL4
# 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 Statement Value Returned by Query
‘19-FEB-2004’ 19-FEB-2004.00.00.000000 AM
SYSTIMESTAMP 19-FEB-04 02.54.36.497659 PM
TO_TIMESTAMP(‘19-FEB-2004’, ‘DD-MON-YYYY’) 19-FEB-04 12.00.00.000000 AM
SYSDATE 19-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 Literal Interpretation
INTERVAL ‘123-2’ YEAR(3) TO MONTH An 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’ YEAR Maps to INTERVAL ‘4-0’ YEAR TO MONTH and indicates 4 years.
INTERVAL ‘50’ MONTH Maps to INTERVAL ‘4-2’ YEAR TO MONTH and indicates 50 months or 4 years 2 months.
INTERVAL ‘123’ YEAR Returns 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 Literal Interpretation
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 MINUTE 4 days, 5 hours and 12 minutes.
INTERVAL ‘400 5’ DAY(3) TO HOUR 400 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 MINUTE 11 hours and 20 minutes.
INTERVAL ‘10’ HOUR 10 hours.
INTERVAL ‘10:22’ MINUTE TO SECOND 10 minutes 22 seconds.
INTERVAL ‘10’ MINUTE 10 minutes.
INTERVAL ‘4’ DAY 4 days.
INTERVAL ‘25’ HOUR 25 hours.
INTERVAL ‘40’ MINUTE 40 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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43949535/article/details/124492371

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文