亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

SQL/PLSQL:日期函數總結

2019-11-10 17:49:45
字體:
來源:轉載
供稿:網友
TO_DATE格式(以當前時間: 2017年2月9日11:25:38 為例)1.年:
yy兩位年顯示值:17
yyy三位年顯示值:017
yyyy四位年 顯示值:2017
2.月:
mm兩位月顯示值:11
3.日:
dd             當月第幾天顯示值:09                        
d當周第幾天 1~7周日=1,周六=7                                 
dy星期幾Mon~Sun 
day星期幾Monday~Sunday 
ddd一年中的第幾天              
4.時
hh2424小時制顯示值:11
5.分
mi     60進制     顯示值:25
6.秒
ss     60進制     顯示值:38

日期函數


1、sysdate:得到數據庫服務器的當前日期和時間 

2、current_date:得到客戶端的當前日期和時間 

select current_date from dual; 

因為數據庫把日期作為數字存儲,因此可以對日期進行加減運算,單位是天。 

1 ) date + n:加減幾天,n可以是負的 

2)date + n/24:加減幾個小時 

3)date  date:相差的天數

 

計算90號部門的雇員在公司工作的總周數 

select last_name,(sysdate - hire_date)/7 weeks 

  from employees where department_id=90; 

例1:給當前日期分別加減3天 

例2:給當前日期加1個小時 

select to_char(sysdate,'YYYYMMDD HH24:MI:SS'), 

       to_char(sysdate + 1/24,'YYYYMMDD HH24:MI:SS') 

  from dual;


MONTHS_BETWEEN(date1, date2) 返回兩個日期差幾個月。 記住是 前 - 后
ADD_MONTHS(date, n): 給日期加減幾個月。N是整數可以為負數`注:加減12個月就是1年!SELECT ADD_months(SYSDATE,-12) FROM dual;    --一年前的今天SELECT ADD_months(SYSDATE,+24) FROM dual;   --兩年后的今天next_day(date,'char'):  找到從date開始的下一個星期幾的日期。char表示星期幾 上面等價于:NEXT_DAY(date,'星期一')例如:

例如:查詢雇員在公司工作的總月數select last_name,months_between(sysdate,hire_date) from employees; 

NEXT_DAY(date,6)  -->下個周五 (這里6,代表星期5,因為美國日期是從星期天開始的,所以1代表的是星期天,2代表星期一,以此類推)

查找今天之后的下一個星期一是幾月幾號? 注意字符集

select next_day(sysdate,'星期一') from dual; 

ORA01846: 周中的日無效 

select next_day(sysdate,'monday') from dual; 

ROUND(date[,'fmt']):  

進位規則:秒=30,分=30,時=12,日=16,月=7; 超過上面分割線就向前一位進1

TRUNC(date [, 'fmt']):  (常用,后面不接參數就是將日期的時分秒去掉)

       

例如 :

規則:按月進行截斷,直接截斷到給定日期的本月的1號 

            按年進行截斷,直接截斷到給定日期的本年月的1月1號  

select sysdate,trunc(sysdate,'month'), trunc(sysdate,'year')  from dual;

   



時間 & 時區

時區概念:地球分24個時區,東西各12個。一個時區代表1個小時。時區值通常以絕對偏移量格式來表示:帶正負號的小時:分鐘。東時區為正的,西時區為負的。時區一旦確定了,日期時間函數的返回值就參照該時區來返回。

Oracle中,時區分為客戶端的和服務器的兩種,分別設置。

設置客戶端的時區使用會話參數:time_zone

1.查看數據庫,會話時區:

select dbtimezone from dual;

select sessiontimezone from dual;

2.設置會話時區為西五區(美國東部時間)

alter session set time_zone = '-05:00'; (絕對偏移量,負為西)

3.設置本會話使用數據庫的時區

alter session set time_zone = dbtimezone;

4.把時區設置成本地

alter session set time_zone = local;  -- (操作系統,可能不支持)

5.時區設置成某地域的時區

alter session set time_zone = 'American/New_York'; -- (操作系統,可能不支持)


和客戶端有關的日期時間函數:3個

current_date   current_timestamp  localtimestamp


三個都返回客戶端的當前日期和時間,區別在于值的數據類型不一樣

sessiontimezone:該函數返回客戶端的時區設置

查看系統各個時間函數:

select sessiontimezone ,

       current_date , 

       current_timestamp , 

       localtimestamp 

  from dual; ---(注意三個時間函數的精度)


數據庫的時區

返回數據庫的時區: 0時區

select dbtimezone from dual;

DBA通過指定手工建庫時CREATE DATABASE 語句的SET TIME_ZONE 子句

來設置數據庫的默認時區。如果省略,那么默認數據庫時區是

操作系統時區。

如果操作系統的時區格式是oracle不支持的,那么就把數據庫的時區設為0時區。官方推薦數據庫的時區都使用0時區。

ALTER SESSION語句不能改變數據庫時區。

TIMESTAMP類型:時間戳類型。3種

-TIMESTAMP數據類型是DATE數據類型的擴展:

1)TIMESTAMP (fractional_seconds_ PRecision)     

2)TIMESTAMP (fractional_seconds_precision) WITH 

     TIME ZONE     帶時區的時間戳

3)TIMESTAMP (fractional_seconds_precision) WITH 

     LOCAL TIME ZONE     帶本地時區的時間戳

其中:fractional_seconds_precision小數秒精度取

值范圍是0-9。默認是6(微秒 ms)

特別注意:最后一種timestamp類型的列,它的值在保存到表中時,會按照數據庫的時區進行自動轉換;當從表中把該類型的列值取出來時,有按照客戶端的時區做自動轉換。

前面兩種timestamp類型的列值不會做這樣的轉換。

例子:

--創建訂單表 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); COMMIT; --美國客戶查詢??吹秸_的日期(西五區的時間) SELECT * FROM   web_orders; --在sqlplus中,國內的物流哥們查詢,看到正確的時間(東八區的時間) SELECT * FROM   web_orders;


時間間隔類型


INTERVAL數據類型用來存儲兩個日期值之間的差值。有兩類INTERVAL: 

INTERVAL YEAR(year_precision) TO MONTH

INTERVAL DAY(day_precision) TO SECOND(fractional_seconds_precision)

year_precision                    是YEAR字段的精度,取值范圍0—9,默認為2.

fractional_seconds_precision 是小數秒的精度,取值范圍0—9,默認為6. 

day_precision                    是DAY字段的最大值(取值范圍0—9,默認為2. )

l=eg:  

1、使用年到月的間隔

create table warranty(

  prod_id number,產品編號

  warranty_tiem interval year(3) to month       --擔保時間,year(3)-年的部分最少有三位

);

注意間隔類型的字面量寫法:ansi語法

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

SQL 錯誤: ORA01873: 間隔的前導精度太小

insert into warranty values(456,interval '200' year);      --必須指定年的精度有3位

insert into warranty values(456,interval '200' year(3));   --正確寫法

注意間隔類型的字面量寫法,oracle簡單語法:'年-月'

insert into warranty values(789,'200-11');   200年 零 11個月簡單寫法

2、使用天到秒的間隔

create table lab(

  exp_id number,

  test_time interval day to second  --day不指定精度默認位2 秒精度默認為6

);

實驗123的測試時間是90天一次

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

insert into lab values(456, interval '06 03:30:16' day to second);

select * from lab;

間隔類型的使用常用于日期的加減運算中


其它日期時間函數


1.EXTRACT 函數:從給定的日期中抽取出特定的部分

extract(.... from .....)

SELECT  EXTRACT ([YEAR] [MONTH][DAY] 

                  [HOUR] [MINUTE][SECOND]

 FROM [datetime_value_expression] |

   [interval_value_expression]);

例如:

select sysdate,extract(year from sysdate)

  from dual;

查詢雇員入職的月份

select hire_date,extract(month from hire_date)

  from employees;

  


2、tz_offset()

將命名地區形式的時區轉換成時區的絕對偏移量

select tz_offset('Asia/Shanghai'),

       tz_offset('Canada/Yukon')

  from dual;     

要得到合法時區名的列表,可以查詢V$TIMEZONE_NAMES動態性能視圖。

SELECT * FROM V$TIMEZONE_NAMES;


3、to_timestamp(char,'fmt')

將字符串以給定的日期格式模型轉換成時間戳

select to_timestamp('20071010 15:25:00','YYYYMMDD HH24:MI:SS')

  from dual;

4、to_yminterval('year-month')

將字符串轉成成年到月的間隔

將雇員的入職日期加上1年2個月

select hire_date,

      hire_date + to_yminterval('01-02')

 from employees;

 

5、to_dsinterval('day hh:mi:ss')

將字符串轉成成天到秒的間隔 

將雇員的入職日期加上100天10個小時

select to_char(hire_date,'YYYYMMDD HH24:MI:SS'),

      to_char(hire_date + to_dsinterval('100 10:00:00'),

              'YYYYMMDD HH24:MI:SS')

 from employees;

 


MONTHS_BETWEEN(date1, date2) 返回兩個日期差幾個月。 記住是 前 - 后
ADD_MONTHS(date, n): 給日期加減幾個月。N是整數可以為負數`注:加減12個月就是1年!SELECT ADD_months(SYSDATE,-12) FROM dual;    --一年前的今天SELECT ADD_months(SYSDATE,+24) FROM dual;   --兩年后的今天next_day(date,'char'):  找到從date開始的下一個星期幾的日期。char表示星期幾 上面等價于:NEXT_DAY(date,'星期一')例如:

例如:查詢雇員在公司工作的總月數select last_name,months_between(sysdate,hire_date) from employees; 

NEXT_DAY(date,6)  -->下個周五 (這里6,代表星期5,因為美國日期是從星期天開始的,所以1代表的是星期天,2代表星期一,以此類推)

查找今天之后的下一個星期一是幾月幾號? 注意字符集

select next_day(sysdate,'星期一') from dual; 

ORA01846: 周中的日無效 

select next_day(sysdate,'monday') from dual; 

ROUND(date[,'fmt']):  

進位規則:秒=30,分=30,時=12,日=16,月=7; 超過上面分割線就向前一位進1

TRUNC(date [, 'fmt']):  (常用,后面不接參數就是將日期的時分秒去掉)

       

例如 :

規則:按月進行截斷,直接截斷到給定日期的本月的1號 

            按年進行截斷,直接截斷到給定日期的本年月的1月1號  

select sysdate,trunc(sysdate,'month'), trunc(sysdate,'year')  from dual;

   



時間 & 時區

時區概念:地球分24個時區,東西各12個。一個時區代表1個小時。時區值通常以絕對偏移量格式來表示:帶正負號的小時:分鐘。東時區為正的,西時區為負的。時區一旦確定了,日期時間函數的返回值就參照該時區來返回。

oracle中,時區分為客戶端的和服務器的兩種,分別設置。

設置客戶端的時區使用會話參數:time_zone

1.查看數據庫,會話時區:

select dbtimezone from dual;

select sessiontimezone from dual;

2.設置會話時區為西五區(美國東部時間)

alter session set time_zone = '-05:00'; (絕對偏移量,負為西)

3.設置本會話使用數據庫的時區

alter session set time_zone = dbtimezone;

4.把時區設置成本地

alter session set time_zone = local;  -- (操作系統,可能不支持)

5.時區設置成某地域的時區

alter session set time_zone = 'American/New_York'; -- (操作系統,可能不支持)


和客戶端有關的日期時間函數:3個

current_date   current_timestamp  localtimestamp


三個都返回客戶端的當前日期和時間,區別在于值的數據類型不一樣

sessiontimezone:該函數返回客戶端的時區設置

查看系統各個時間函數:

select sessiontimezone ,

       current_date , 

       current_timestamp , 

       localtimestamp 

  from dual; ---(注意三個時間函數的精度)


數據庫的時區

返回數據庫的時區: 0時區

select dbtimezone from dual;

DBA通過指定手工建庫時CREATE DATABASE 語句的SET TIME_ZONE 子句

來設置數據庫的默認時區。如果省略,那么默認數據庫時區是

操作系統時區。

如果操作系統的時區格式是oracle不支持的,那么就把數據庫的時區設為0時區。官方推薦數據庫的時區都使用0時區。

ALTER SESSION語句不能改變數據庫時區。

TIMESTAMP類型:時間戳類型。3種

-TIMESTAMP數據類型是DATE數據類型的擴展:

1)TIMESTAMP (fractional_seconds_ precision)     

2)TIMESTAMP (fractional_seconds_precision) WITH 

     TIME ZONE     帶時區的時間戳

3)TIMESTAMP (fractional_seconds_precision) WITH 

     LOCAL TIME ZONE     帶本地時區的時間戳

其中:fractional_seconds_precision小數秒精度取

值范圍是0-9。默認是6(微秒 ms)

特別注意:最后一種timestamp類型的列,它的值在保存到表中時,會按照數據庫的時區進行自動轉換;當從表中把該類型的列值取出來時,有按照客戶端的時區做自動轉換。

前面兩種timestamp類型的列值不會做這樣的轉換。

例子:

--創建訂單表 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); COMMIT; --美國客戶查詢。看到正確的日期(西五區的時間) SELECT * FROM   web_orders; --在sqlplus中,國內的物流哥們查詢,看到正確的時間(東八區的時間) SELECT * FROM   web_orders;


時間間隔類型


INTERVAL數據類型用來存儲兩個日期值之間的差值。有兩類INTERVAL: 

INTERVAL YEAR(year_precision) TO MONTH

INTERVAL DAY(day_precision) TO SECOND(fractional_seconds_precision)

year_precision                    是YEAR字段的精度,取值范圍0—9,默認為2.

fractional_seconds_precision 是小數秒的精度,取值范圍0—9,默認為6. 

day_precision                    是DAY字段的最大值(取值范圍0—9,默認為2. )

l=eg:  

1、使用年到月的間隔

create table warranty(

  prod_id number,產品編號

  warranty_tiem interval year(3) to month       --擔保時間,year(3)-年的部分最少有三位

);

注意間隔類型的字面量寫法:ansi語法

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

SQL 錯誤: ORA01873: 間隔的前導精度太小

insert into warranty values(456,interval '200' year);      --必須指定年的精度有3位

insert into warranty values(456,interval '200' year(3));   --正確寫法

注意間隔類型的字面量寫法,oracle簡單語法:'年-月'

insert into warranty values(789,'200-11');   200年 零 11個月簡單寫法

2、使用天到秒的間隔

create table lab(

  exp_id number,

  test_time interval day to second  --day不指定精度默認位2 秒精度默認為6

);

實驗123的測試時間是90天一次

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

insert into lab values(456, interval '06 03:30:16' day to second);

select * from lab;

間隔類型的使用常用于日期的加減運算中


其它日期時間函數


1.EXTRACT 函數:從給定的日期中抽取出特定的部分

extract(.... from .....)

SELECT  EXTRACT ([YEAR] [MONTH][DAY] 

                  [HOUR] [MINUTE][SECOND]

 FROM [datetime_value_expression] |

   [interval_value_expression]);

例如:

select sysdate,extract(year from sysdate)

  from dual;

查詢雇員入職的月份

select hire_date,extract(month from hire_date)

  from employees;

  


2、tz_offset()

將命名地區形式的時區轉換成時區的絕對偏移量

select tz_offset('Asia/Shanghai'),

       tz_offset('Canada/Yukon')

  from dual;     

要得到合法時區名的列表,可以查詢V$TIMEZONE_NAMES動態性能視圖。

SELECT * FROM V$TIMEZONE_NAMES;


3、to_timestamp(char,'fmt')

將字符串以給定的日期格式模型轉換成時間戳

select to_timestamp('20071010 15:25:00','YYYYMMDD HH24:MI:SS')

  from dual;

4、to_yminterval('year-month')

將字符串轉成成年到月的間隔

將雇員的入職日期加上1年2個月

select hire_date,

      hire_date + to_yminterval('01-02')

 from employees;

 

5、to_dsinterval('day hh:mi:ss')

將字符串轉成成天到秒的間隔 

將雇員的入職日期加上100天10個小時

select to_char(hire_date,'YYYYMMDD HH24:MI:SS'),

      to_char(hire_date + to_dsinterval('100 10:00:00'),

              'YYYYMMDD HH24:MI:SS')

 from employees;

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美乱大交xxxxx| 精品久久久香蕉免费精品视频| 91精品国产91久久久久久吃药| 国产va免费精品高清在线| 欧美一级在线播放| 亚洲成av人影院在线观看| 一区二区三区久久精品| 欧美日韩在线一区| 欧美日韩在线一区| 欧美在线视频免费观看| 欧美日韩国产va另类| 97免费中文视频在线观看| 精品久久久久久久久久| 国产精品欧美一区二区三区奶水| 久久中文字幕在线| 国产精品激情av在线播放| 韩日欧美一区二区| 亚洲春色另类小说| 伊人久久久久久久久久久久久| 国产日本欧美在线观看| 欧美国产日产韩国视频| 亚洲一区二区黄| 91色中文字幕| 色婷婷av一区二区三区在线观看| 欧美日韩亚洲视频| 日韩在线视频网站| 国产精品黄色影片导航在线观看| 国产成+人+综合+亚洲欧洲| 97高清免费视频| 青青青国产精品一区二区| 亚洲欧美制服中文字幕| 欧美极品在线视频| 亚洲精品成人免费| 日本国产欧美一区二区三区| 成人亚洲激情网| 亚洲欧洲国产精品| 国产偷国产偷亚洲清高网站| 亚洲网站视频福利| 亚洲第一天堂av| 国产成人精品久久二区二区| 日韩电影第一页| 久久九九全国免费精品观看| 国产99视频精品免视看7| 欧美日韩美女在线| 国产原创欧美精品| 亚洲人成电影网站色| 精品视频www| 国产精品网红福利| 国内精品久久久久影院优| 成人自拍性视频| 欧美做爰性生交视频| 黄色精品在线看| 久久久久久成人| 国产婷婷色综合av蜜臀av| 欧美视频在线免费看| 91热福利电影| 成人免费在线网址| 日韩av一区在线观看| 国产福利精品av综合导导航| 中文字幕日韩欧美在线| 国产精品青草久久久久福利99| 亚洲欧美一区二区三区久久| 久99久在线视频| 久久综合免费视频| 欧美色图在线视频| 精品久久久999| 午夜美女久久久久爽久久| 色综合老司机第九色激情| 精品久久久国产精品999| 在线日韩av观看| 岛国av一区二区在线在线观看| 日韩免费在线播放| 国产成人极品视频| 午夜美女久久久久爽久久| 欧美日韩国产精品一区| 日韩禁在线播放| 久久精视频免费在线久久完整在线看| 这里只有精品在线观看| 国产成人精品最新| 在线国产精品播放| 亚洲美女又黄又爽在线观看| 成人性生交大片免费观看嘿嘿视频| 精品视频久久久| 91沈先生在线观看| 亚洲一区第一页| 欧美日韩aaaa| 午夜精品一区二区三区视频免费看| 久青草国产97香蕉在线视频| 黑人巨大精品欧美一区二区一视频| 亚洲最大的网站| 亚洲人成在线观看| 久久全国免费视频| 久久777国产线看观看精品| 日韩有码视频在线| 国产精品久久在线观看| 精品日本高清在线播放| 亚洲缚视频在线观看| 中文字幕日韩av综合精品| 中文字幕欧美国内| 久久精品成人欧美大片| 一本色道久久综合狠狠躁篇怎么玩| 亚洲www在线观看| 亚洲人成在线电影| 国产一区二区激情| 91精品久久久久久久久久| 国产一区二区三区在线观看网站| 国产91色在线| 国产精品一区二区三区久久| 午夜精品一区二区三区视频免费看| 国产日韩欧美电影在线观看| 97超碰蝌蚪网人人做人人爽| 国产精品久久电影观看| 亚洲欧美激情一区| 日本a级片电影一区二区| 亚洲精品视频免费在线观看| 亚洲一区二区精品| 成人激情视频免费在线| 美女福利精品视频| 日韩成人av网| 欧美激情一二区| 日韩av免费在线| 亚洲a∨日韩av高清在线观看| 人九九综合九九宗合| 日韩电影免费在线观看| 91在线无精精品一区二区| 国产精品专区h在线观看| 超碰97人人做人人爱少妇| www.亚洲男人天堂| 中文字幕久热精品视频在线| 成人午夜黄色影院| 欧美日韩中文字幕综合视频| 成人免费淫片视频软件| 中文日韩电影网站| 精品国产91乱高清在线观看| 欧美电影免费观看| 国产精品偷伦免费视频观看的| 欧美—级a级欧美特级ar全黄| 狠狠色噜噜狠狠狠狠97| 欧美激情第1页| 91地址最新发布| 免费av在线一区| 日韩美女主播视频| 亚洲国产又黄又爽女人高潮的| 国产精品爽爽ⅴa在线观看| 亚洲精品乱码久久久久久金桔影视| 国产午夜精品视频| 日韩中文字幕在线视频播放| 黑人巨大精品欧美一区二区一视频| 91免费在线视频| 国内偷自视频区视频综合| 97香蕉超级碰碰久久免费的优势| 亚洲第一福利网| 欧美日本高清一区| 欧美老女人bb| 日韩av免费看网站| 中文字幕无线精品亚洲乱码一区| 久久精品久久久久| 成人激情视频在线播放| 少妇久久久久久| 亚洲人成网在线播放| 色偷偷av亚洲男人的天堂| 日韩在线小视频| 欧美极品少妇xxxxⅹ喷水| 亚洲国产精品字幕|