SQL時間查詢和子查詢

1,插入記錄使用INSERT 語句。

INSERT INTO tableName(列名列表) VALUES(值列表)

tableName--表明給哪個表中插入記錄

列名列表--表明要給哪幾個列插入值

值列表--插入的具體值

插入新記錄後記得執行以下SQL語句:

COMMIT;

【示例】給顧客表中插入一條新記錄:7,張三,1989-09-02,029-9878998
對於出生日期的值,如果直接採用字符串的形式,那麼日期格式要符合當前會話的nls_date_language和nls_date_format的要求。
可通過select * from v$nls_parameters;查看當前會話的參數信息;
可以採用DATE關鍵字後跟日期字面量,如:DATE‘1989-09-02’ 。這樣能夠顯式將字符串轉換爲日期值,要求日期格式必須是’YYYY-MM-DD’的形式。

eg:

SQL> insert into customers (customer_id, first_name, last_name, dob, phone) values(6, 'cissst', 'cissst', to_date('1992-01-01', 'yyyy-mm-dd'), 888-888-8888);

(日期格式要匹配 注意字符串和日期類型 數字類型和字符串類型的區別)

已創建 1 行。

SQL> select * from customers;

CUSTOMER_ID FIRST_NAME LAST_NAME  DOB            PHONE                          
----------- ---------- ---------- -------------- ------------                   
          6 cissst     cissst     01-1月 -92     -8888                          
          1 John       Brown      01-1月 -65     800-555-1211                   
          2 Cynthia    Green      05-2月 -68     800-555-1212                   
          3 Steve      White      16-3月 -71     800-555-1213                   
          4 Gail       BLACK                     800-555-1214                   
          5 Doreen     Blue       20-5月 -70                                    

1,使用TO_CHAR(x[,format])將日期值轉換爲字符串

x -- 一個日期值

format字符串用來說明轉換後的字符串的格式,如果沒有該參數,則使用當前會話中的日期語言和日期格式進行轉換。

format中可使用的格式化參數有:

CC --兩位的世紀

YYYY -- 四位的年份    

YY -- 兩位的年份

MM -- 兩位的月份

MONTH --月份的完整單詞,全大寫(如果當前會話的日期語言是中文,則顯示:x月)

Month --月份的完整單詞,首字母大寫

MON --月份單詞的前三個字母,全大寫    Mon -- 月份單詞的前三個字母,首字母大寫

DD -- 本月中的第幾天

DAY -- 周幾的完整單詞,全大寫

Day  -- 周幾的完整單詞,首字母大寫

Dy -- 周幾單詞的前三個字母,首字母大寫

HH24 -- 24小時格式的小時     
 
HH -- 12小時格式的小時

MI -- 分

SS --秒

【示例】顯示顧客表中的信息,並將出生日期列的值轉換爲”YYYY/MM/DD Dy”的形式

eg:

SQL> select sysdate from dual;

SYSDATE                                                                         
--------------                                                                  
15-5月 -15                                                                      

SQL> select to_char(sysdate) from dual;

TO_CHAR(SYSDAT                                                                  
--------------                                                                  
15-5月 -15                                                                      

SQL> select to_char(sysdate, 'cc') from dual;

TO                                                                              
--                                                                              
21                                                                              

SQL> select to_char(sysdate, 'cc yyyy') from dual;

TO_CHAR                                                                         
-------                                                                         
21 2015                                                                         

SQL> select to_char(sysdate, 'cc yy') from dual;

TO_CH                                                                           
-----                                                                           
21 15                                                                           

SQL> select to_char(sysdate, 'cc yyyy') from dual;

TO_CHAR                                                                         
-------                                                                         
21 2015                                                                         

SQL> select to_char(sysdate, 'cc yyyy-mm') from dual;

TO_CHAR(SY                                                                      
----------                                                                      
21 2015-05                                                                      

SQL> select to_char(sysdate, 'cc yyyy-mon') from dual;

TO_CHAR(SYSDATE,                                                                
----------------                                                                
21 2015-5月                                                                     

SQL> select to_char(sysdate, 'cc yyyy-month') from dual;

TO_CHAR(SYSDAT                                                                  
--------------                                                                  
21 2015-5月                                                                     

SQL> select to_char(sysdate, 'cc yyyy-month-dd') from dual;

TO_CHAR(SYSDATE,'                                                               
-----------------                                                               
21 2015-5月 -15                                                                 

SQL> select to_char(sysdate, 'cc yyyy-dd-mm') from dual;

TO_CHAR(SYSDA                                                                   
-------------                                                                   
21 2015-15-05                                                                   

SQL> select to_char(sysdate, 'cc dd/mm/yyyy') from dual;

TO_CHAR(SYSDA                                                                   
-------------                                                                   
21 15/05/2015                                                                   

SQL> select to_char(sysdate, 'cc dd/mm/yyyy day') from dual;

TO_CHAR(SYSDATE,'CCDD/M                                                         
-----------------------                                                         
21 15/05/2015 星期五                                                            

SQL> select to_char(sysdate, 'cc dd/mm/yyyy day dy') from dual;

TO_CHAR(SYSDATE,'CCDD/MM/YYYYDAYDY')                                            
------------------------------------                                            
21 15/05/2015 星期五 星期五                                                     

SQL> select to_char(sysdate, 'cc dd/mm/yyyy day dy hh:mi:ss') from dual;

TO_CHAR(SYSDATE,'CCDD/MM/YYYYDAYDYHH:MI:SS')                                    
---------------------------------------------                                   
21 15/05/2015 星期五 星期五 09:28:32                                            

SQL> select to_char(sysdate, 'cc dd/mm/yyyy day dy h:mi:s') from dual;
select to_char(sysdate, 'cc dd/mm/yyyy day dy h:mi:s') from dual
                        *
第 1 行出現錯誤: 
ORA-01821: 日期格式無法識別 (必須雙寫 不能單寫)


SQL> select to_char(sysdate, 'cc dd/mm/yyyy day dy h:mi:ss') from dual;
select to_char(sysdate, 'cc dd/mm/yyyy day dy h:mi:ss') from dual
                        *
第 1 行出現錯誤: 
ORA-01821: 日期格式無法識別 


SQL> select to_char(sysdate, 'cc dd/mm/yyyy day dy hh:mi:ss') from dual;

TO_CHAR(SYSDATE,'CCDD/MM/YYYYDAYDYHH:MI:SS')                                    
---------------------------------------------                                   
21 15/05/2015 星期五 星期五 09:29:13                              


SQL> select customer_id, to_char(dob, 'yyyy/mm/dd dy') from customers order by customer_id;

CUSTOMER_ID TO_CHAR(DOB,'YYYY/MM/DD                                             
----------- -----------------------                                             
          1 1965/01/01 星期五                                                   
          2 1968/02/05 星期一                                                   
          3 1971/03/16 星期二                                                   
          4                                                                     
          5 1970/05/20 星期三                                                   
          6 1992/01/01 星期三                                                   
          7 1992/01/01 星期三                                                   
          8 1992/01/01 星期三         


2,使用TO_DATE(x[,format])函數將字符串轉換爲日期值

x--一個日期字符串

format--用來說明字符串中的日期格式。格式字符串中可使用的參數和前面一樣。如果沒有該參數,則默認使用當前會話中的日期語言和日期格式進行轉換。


【示例】給顧客表中插入一條新記錄:8,李四,1988-08-11 19:08:23,029-87668899

SQL> insert into customers values(9, 'jinping', 'xi', to_date('2015-05-14', 'yyyy-mm-dd'), '999-999-9999');
注:

(1)轉換時,實際日期值月和日對應的字符位數可以不足,但不能超過寬度。

SQL> insert into customers values(10, 'jinping', 'xi', to_date('2015-5-14', 'yyyy-mm-dd'), '999-999-9999');


(2) 如果實際日期值年份對應的值只有兩位,而格式字符串中是’YYYY’,則轉換後的日期年份前兩位補零。

SQL> insert into customers values(9, 'jinping', 'xi', to_date('15-05-14', 'yyyy-mm-dd'), '999-999-9999');

 9 jinping    xi         2014-5月 -15     999-999-9999  ;


如果格式字符串中是’YY’,則轉換後的日期年份前兩位和當前系統日期的世紀相同。

SQL> insert into customers values(9, 'jinping', 'xi', to_date('15-05-14', 'yy-mm-dd'), '999-999-9999');

 9 jinping    xi         2014-5月 -15     999-999-9999  ;


如果實際日期值年份對應的值只有兩位,而格式字符串中是’RRRR’或’RR’,則轉換後的日期年份前兩位根據如下規則進行解釋:數據不見啦  百度吧

00-49 年  轉換的年份   00-49   轉換結果 (轉換後的年份前兩位和系統相同) 50- 99  轉換結果(當前系統年份前兩位減一

系統 50-99 年  轉換的年份   00-49   轉換結果 (當前系統年份前兩位加一) 50- 99  轉換結果 (轉換後的年份前兩位和系統相同

eg:

系統 00-49 年  轉換的年份   00-49   轉換結果  50- 99  轉換結果

      2014     2014 2014    2065 1965

 系統 50-99 年  轉換的年份   00-49   轉換結果  50- 99  轉換結果 

      2065     2014 2114    2044 2044

三、日期值相關函數

1,ADD_MONTHS(x,y)

返回日期值x加上y個月後的結果。如果y爲負值,則表示減去y個月。
eg:

SQL> select add_months(sysdate, 1) from dual; (如果大於12個月 則向前加一年)

ADD_MONTHS(SYS                                                                  
--------------                                                                  
15-6月 -15                   

eg:

SQL> select add_months(sysdate, -26) from dual;

ADD_MONTHS(SYS                                                                  
--------------                      (小於12個月,向後減去一年)                                            
15-3月 -13     

2,LAST_DAY(x)

返回日期值x當月的最後一天的日期。



SQL> select last_day(sysdate) from dual;

LAST_DAY(SYSDA                                                                  
--------------                                                                  
31-5月 -15  

eg:

SQL> select to_char(last_day(add_months(sysdate, -3)), 'yyyy-mm-dd') from dual;

TO_CHAR(LA                                                                      
----------  (按照格式可以數個函數相疊加)                                                                      
2015-02-28   

3,MONTHS_BETWEEN(x,y)

返回日期x減去日期y後的月份差。

SQL> select months_between(date'1990-1-1', sysdate) from dual;

4,NEXT_DAY(x,day)

day--是一個表示星期幾的字符串(和nls_date_language有關,如’saturday’ ,’星期六’)

該函數返回從日期x開始,到達下個指定的星期幾的日期

eg:SQL> select next_day(sysdate, 'sat') from dual;

NEXT_DAY(S                                                                      
----------                                                                      
2015-05-16   

eg:(寫在中間的小亂入)

SQL> select to_char(add_months(sysdate, -4), 'mon') from dual;

TO_CHA                                                                          
------                                                                          
jan                                                                             

SQL> select to_char(add_months(sysdate, -4), 'month') from dual;

TO_CHAR(ADD_M                                                                   
-------------                                                                   
january                     

5,ROUND(x[,unit])

對日期進行舍入取整,如果沒有參數unit,則將日期舍入爲最近的一天。如果有參數unit,它表示對指定的單元進行操作。
例如,unit取’YYYY’則表示舍入到最近的年份;‘MM’表示舍入到最近的月份;’HH’表示舍入到最近的分鐘。。。。。。

eg:

SQL> select round(date'2015-5-19', 'mm') from dual;

ROUND(DATE                                                                      
----------     (四捨五入到6月)                                                                 
2015-06-01                                                                      

SQL> select round(date'2015-5-19', 'yyyy') from dual;

ROUND(DATE                                                                      
----------    (四捨五入到最近的一年)                                                                  
2015-01-01                                                                      

SQL> select round(date'2015-8-19', 'yyyy') from dual;

ROUND(DATE                                                                      
----------    (四捨五入到最近的一年)                                                              
2016-01-01    

6,TRUNC(x[,unit])

對日期值x進行截斷操作。如果沒有參數unit,則將日期截斷爲當天的開始時間,即00:00:00.

如果參數unit爲‘YYYY’,則表示返回當年的第一天;

如果unit爲‘MM’,則表示返回當月的第一天;

如果unit爲’HH’,則表示將分和秒置爲0.

eg:

SQL> select trunc(sysdate, 'yyyy') from dual;

TRUNC(SYSD                                                                      
----------                                                                      
2015-01-01    

四.時間戳

時間戳(timestamp)是一種數據類型,該類型可以存儲一個比較精確的時間點。世紀、四位年份、月、日、小時、分、帶小數位的秒。

TIMESTAMP(second_precision)

second_precision代表秒的小數位寬度,取值在0和9之間。

store模式中的表purchases_with_timestamp中含有時間戳類型的列。

eg:

SQL> select product_id, customer_id, to_char(made_on, 'cc yyyy-mm-dd hh:mi:ss') from purchases_with_timestamp;(select後的選擇內容中可以進行列的tochar操作)

要設置當前會話中的時間戳數據的顯示格式,可以使用如下設置語句:

alter session set nls_timestamp_format=‘HH24:MI:SS.FF9’; 

1,要給表中插入時間戳類型的數據時,可以在字符串形式的值前面使用TIMESTAMP關鍵字。

例如:TIMESTAMP’2012-09-11 18:23:56.324523321’

當表中該時間戳列的精度小於實際值時,實際值會被自動進行舍入操作。

2,字符串和時間戳值之間的轉換可以使用以下函數:

TO_TIMESTAMP(x,format)

示例:

TO_TIMESTAMP('2012-09-11 19:09:45.9876543','YYYY-MM-DD HH24:MI:SS.FF9')

eg:

SQL> select systimestamp from dual;

SYSTIMESTAMP                                                            
---------------------------------------------------------------------------                                                         
15-MAY-15 10.10.05.296000 AM +08:00     

eg:(可以選擇中間的一部分 這個可以注意下  選擇少數數據的一種寫法)

SQL> select to_char(systimestamp, 'mi:ss.ff9') from dual;

TO_CHAR(SYSTIME                                                  
---------------                                                       
10:35.234000000               

五、時間間隔

時間間隔數據類型用來存儲一段時間長度。Oracle中提供了兩種表示時間間隔的數據類型:

1,INTERVAL YEAR(precision) TO MONTH   (用於表示n年m月的間隔)

precision表示年數的位數,取值範圍0~9,默認爲2

2,INTERVAL DAY(precision1) TO SECOND(precision2)   (用於表示n天m秒的間隔)

precision1表示天數的位數,取值範圍0~9,默認爲2

precision2表示秒的小數部分的位數,取值範圍0~9,默認爲6

時間間隔可以是正數,也可以是負數。


coupons表中存儲了優惠券信息,其中的duration列(INTERVAL YEAR(3) TO MONTH)用來記錄優惠券的有效時間間隔。

如果要給coupons表中duration列插入數據,可使用以下方式得到一個時間間隔值:

1,使用關鍵字: INTERVAL ‘n-m’  YEAR(x) TO MONTH

示例:

INTERVAL ‘2’ YEAR --年份默認位數爲2

INTERVAL ’2’ YEAR(3) --年份實際值可以小於聲明的位數,但不能超過

INTERVAL ‘3’ MONTH

INTERVAL ‘2-4’ YEAR TO MONTH

INTERVAL ’23-10’ YEAR(3) TO MONTH 

INTERVAL ’234-5’ YEAR(3) TO MONTH

eg:
SQL> insert into coupons values(7, '$99 off test', to_yminterval('2-3'));

注:年份的位數不能超過表中列的實際類型寬度,否則出錯

2,使用TO_YMINTERVAL(x)函數

x--是形如’y-m‘的字符串

示例:TO_YMINTERVAL(’23-5’)

3,使用NUMTOYMINTERVAL(x,unit) 函數

x--數值

unit--轉換單位,可取值’YEAR’ 或‘MONTH’

示例: NUMTOYMINTERVAL(2.5,’YEAR’)


promotions表用來存儲促銷信息,其中的duration列(INTERVAL DAY(3) TO SECOND(4))記錄促銷的時間間隔。
如果要給promotions表的duration列插入數據:


1,使用關鍵字: INTERVAL  ‘d h:m:s’ DAY(x) TO SECOND(y)
示例:

INTERVAL ‘1’ DAY --天的默認位數爲2

INTERVAL ‘4’ MINUTE

INTERVAL ‘34’ SECOND

INTERVAL ‘2 3’ DAY TO HOUR

INTERVAL ‘1 2:2’ DAY TO MINUTE

INTERVAL ‘2 0:0:34’ DAY TO SECOND

INTERVAL ‘123 2:23:45’ DAY(3) TO SECOND

INTERVAL ‘123 2:23:45.678’ DAY(3) TO SECOND(3)

2,使用TO_DSINTERVAL(x)函數

x--是形如’d h:m:s.f‘的字符串

示例:TO_DSINTERVAL('23 2:23:56.23');

3,使用NUMTODSINTERVAL(x,unit) 函數

x--數值

unit--轉換單位,可取值’DAY’ 、‘HOUR’、’MINUTE’、’SECOND’.

示例: NUMTODSINTERVAL(2.5,’MINUTE’)
                                                        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章