国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

SQL/PLSQL:日期函數總結

2019-11-09 19:57:34
字體:
來源:轉載
供稿:網友
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;

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德令哈市| 大埔县| 广宗县| 汝城县| 自贡市| 桓仁| 雅安市| 绩溪县| 临清市| 高尔夫| 手游| 民和| 杭锦后旗| 冷水江市| 龙江县| 高唐县| 镶黄旗| 获嘉县| 成武县| 柳州市| 东乡| 磐石市| 温州市| 腾冲县| 界首市| 郴州市| 诸城市| 兴仁县| 乌鲁木齐市| 红河县| 沾化县| 临漳县| 乡城县| 金秀| 梅州市| 保山市| 河津市| 方山县| 酉阳| 丰都县| 巩义市|