溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL 基礎之時區(qū)函數(shù)(二十一)

發(fā)布時間:2020-08-21 01:40:11 來源:網(wǎng)絡 閱讀:406 作者:yuri_cto 欄目:數(shù)據(jù)庫

使用數(shù)據(jù)類型來存儲兩個日期時間值之間的時間差

使用下列的日期時間函數(shù):

– CURRENT_DATE

– CURRENT_TIMESTAMP

– LOCALTIMESTAMP

– DBTIMEZONE

– SESSIONTIMEZONE

– EXTRACT

– TZ_OFFSET

– FROM_TZ

– TO_TIMESTAMP

– TO_YMINTERVAL

– TO_DSINTERVAL


TIME_ZONE 可以設置為:

絕對偏移量

數(shù)據(jù)庫的時區(qū)

OS本地時區(qū)

區(qū)域名

alter session set time_zone = '-05:00';

alter session set time_zone = dbtimezone;

alter session set time_zone = local;

alter session set time_zone = 'America/New_York';


TIMESTAMP 數(shù)據(jù)類型

數(shù)據(jù)類型范圍
TIMESTAMP年,月,日,時,分,秒與秒的小數(shù)部分
TIMESTAMP WITH TIME ZONE與TIMESTAMP數(shù)據(jù)類型相同;還包括:TIMEZONE_HOUR,TIMEZONE_MINUTE或TIMEZONE_REGION

TIMESTAMP WITH LOCAL TIME ZONE

存儲類型與 TIMESTAMP 相似,在用戶提交時間給數(shù)據(jù)庫的時,該類型會轉換成數(shù)據(jù)庫的時區(qū)來保存數(shù)據(jù),即數(shù)據(jù)庫保存的時間是數(shù)據(jù)庫本地時區(qū),當用戶訪問數(shù)據(jù)庫時 oracle 會自動將該時間轉換成當前客戶端的時間


TIMESTAMP 字段

Datetime  字段有效值
YEAR–4712 to 9999 (不包括0年)
MONTH01 to 12
DAY01 to 31
HOUR00 to 23
MINUTE00 to 59
SECOND00 to 59.9(N) -- 注:9(N)為精度
TIMEZONE_HOUR-12 to 14 
TIMEZONE_MINUTE00 to 59



create table web_orders (order_date timestamp with time zone,delivery_time timestamp with local time zone);


insert into web_orders values (current_date, current_timestamp + 2);


select * from web_orders;


DATE 與 TIMESTAMP的區(qū)別

select hire_date from employees;

SQL 基礎之時區(qū)函數(shù)(二十一)


alter table employees modify hire_date timestamp;

select hire_date from employees;

SQL 基礎之時區(qū)函數(shù)(二十一)


  • CURRENT_DATE:

– 從用戶會話返回當前的日期

– 返回的是DATE數(shù)據(jù)類型

  • CURRENT_TIMESTAMP:

– 從用戶會話返回當前的日期和時間

– 返回的是TIMESTAMP WITH TIME ZONE數(shù)據(jù)類型

  • LOCALTIMESTAMP:

– 從用戶會話返回當前的日期和時間

– 返回的是TIMESTAMP數(shù)據(jù)類型


比較會話的時區(qū)的日期和時間

將參數(shù)TIME_ZONE設置為–5:00,然后使用SELECT 語句查看每個日期和時間的差異比較。

alter session set nls_date_format = 'DD-MON-YYYY HH24:MI:SS';

alter session set time_zone = '-5:00';

select sessiontimezone, current_date from dual;

SESSIONTIMEZONE   CURRENT_DATE

--------------------------- --------------------------------------------------

-05:00                            27-3  -2017 01:12:37


select sessiontimezone, current_timestamp from dual;

SESSIONTIMEZONE   CURRENT_TIMESTAMP

--------- ---------------------------------------------------------------------------

-05:00                            27-3  -17 01.13.23.473132  -05:00


select sessiontimezone, localtimestamp from dual;

SESSIONTIMEZONE   LOCALTIMESTAMP

------------ ---------------------------------------------------------------------------

-05:00                           27-3  -17 01.14.06.470998


DBTIMEZONE 和 和 SESSIONTIMEZONE

顯示數(shù)據(jù)庫時區(qū):

select dbtimezone from dual;

DBTIMEZONE

------------------

+00:00


顯示會話時區(qū):

select sessiontimezone from dual;


INTERVAL 數(shù)據(jù)類型

INTERVAL 數(shù)據(jù)類型用于存儲兩個日期的差值。

有兩種類型的間隔:

– Year-month

– Day-time

時間間隔的精度:

– 實際的范圍子集構成的間隔

– 指定的時間間隔

數(shù)據(jù)類型范圍
INTERVAL YEAR TO MONTH年、月
INTERVAL DAY TO SECOND天、小時、分鐘、秒及小數(shù)部分


INTERVAL 范圍

INTERVAL范圍間隔有效值
YEAR任何正、負的整數(shù)
MONTH00 to 11
DAY任何正、負的整數(shù)
HOUR00 to 23
MINUTE00 to 59
SECOND00 to 59.9(N) –注:9(N)為精度 


INTERVAL YEAR TO MONTH :示例

create table warranty (prod_id number, warranty_time interval year(3) to month);

insert into warranty values (123, interval '8' month);

insert into warranty values (155, interval '200' year(3));

insert into warranty values (678, '200-11');

select * from warranty;


INTERVAL DAY TO SECOND 示例

create table lab ( exp_id number, test_time interval day(2) to second);

insert into lab values (100012, '90 00:00:00');

insert into lab values (56098,

interval '6 03:30:16' day to second);


EXTRACT

從SYSDATE顯示年份:

select extract (year from sysdate) from dual;


顯示MANAGER_ID為100的員工的HIRE_DATE的月份:

select last_name, hire_date, extract (month from hire_date) from employees

where manager_id = 100;


TZ_OFFSET

顯示UTC與‘US/Eastern’ (美國/ 東部), ‘Canada/Yukon’ (加拿大/ 育空) 和 ‘Europe/London’ (歐洲/ 倫敦) 的時區(qū)偏移量


select tz_offset('us/eastern'),

tz_offset('canada/yukon'),

tz_offset('europe/london')

from dual;


FROM_TZ

顯示TIMESTAMP 值 ‘2000-03-28 08:00:00’ 時區(qū)為‘Australia/North’(澳大利亞/北), TIMESTAMP WITH TIME ZONE值。

select from_tz(timestamp '2000-07-12 08:00:00', 'australia/north') from dual;


TO_TIMESTAMP

顯示字符串‘2007-03-06 11:00:00’ 的 TIMESTAMP 值:

select to_timestamp ('2007-03-06 11:00:00','YYYY-MM-DD HH:MI:SS') from dual;


TO_YMINTERVAL

顯示DEPARTMENT_ID為20的員工的雇傭日期1年零2個月后的日期。

select hire_date,hire_date + TO_YMINTERVAL('01-02') AS

HIRE_DATE_YMININTERVAL

from employees where department_id = 20;


TO_DSINTERVAL

顯示全體員工雇傭日期100天零10小時候的日期

select last_name,

TO_CHAR(hire_date, 'mm-dd-yy:hh:mi:ss') hire_date,

TO_CHAR(hire_date +

TO_DSINTERVAL('100 10:00:00'),

'mm-dd-yy:hh:mi:ss') hiredate2

from employees;


夏令時

4月的第一個星期日

– Time jumps from 01:59:59 AM to 03:00:00 AM.

– Values from 02:00:00 AM to 02:59:59 AM are not valid.

– 時間從上午01:59:59跳躍到上午03:00:00 

– 值從上午02:00:00至02:59:59時是無效的


10月的最后一個星期日

– Time jumps from 02:00:00 AM to 01:00:01 AM.

– Values from 01:00:01 AM to 02:00:00 AM are ambiguous

because they are visited twice.

– 時間從上午02:00:00跳躍到上午01:00:01 。

– 值從上午01:00:01至上午02:00:00是不明確的,因為他們去過兩次

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI