1. 程式人生 > >資料庫SQL中的資料型別轉換

資料庫SQL中的資料型別轉換

oracle有三種最基本的資料型別,即字元型、數值型、日期型。 (注意需要起別名的地方要起別名)
oracle提供的單行函式中,針對不同的資料型別,提供大量實用的函式,同時提供一系列資料型別轉換函式,如下: 

sql.append(" select CURVE_NAME,S_YEAR_LIMIT,AVERAGE_VALUE,to_char(d_date,'yyyy-MM-dd') d_date from t_treasury_yield_curve t where d_date = to_date ('"+d_date+"','yyyy-MM-dd')");		

24 小時的形式顯示出來要用 HH24


select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;


select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;



to_date() function


1. 日期格式引數 含義說明



D 一週中的星期幾


DAY 天的名字,使用空格填充到 9 個字元


DD 月中的第幾天


DDD 年中的第幾天


DY 天的簡寫名


IW ISO 標準的年中的第幾周


IYYY ISO 標準的四位年份


YYYY 四位年份


YYY,YY,Y 年份的最後三位,兩位,一位


HH 小時,按 12 小時計


HH24 小時,按 24 小時計


MI 分


SS 秒


MM 月


Mon 月份的簡寫


Month 月份的全名


W 該月的第幾個星期


WW 年中的第幾個星期      1. 日期時間間隔操作


當前時間減去 7 分鐘的時間


select sysdate,sysdate - interval '7' MINUTE from dual


當前時間減去 7 小時的時間


select sysdate - interval '7' hour from dual


當前時間減去 7 天的時間


select sysdate - interval '7' day from dual


當前時間減去 7 月的時間


select sysdate,sysdate - interval '7' month from dual


當前時間減去 7 年的時間


select sysdate,sysdate - interval '7' year from dual


時間間隔乘以一個數字


select sysdate,sysdate - 8 *interval '2' hour from dual


 


2. 日期到字元操作



select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual


select sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual


select sysdate,to_char(sysdate,'yyyy-ddd hh:mi:ss') from dual


select sysdate,to_char(sysdate,'yyyy-mm iw-d hh:mi:ss') from dual


參考 oracle 的相關關文件 (ORACLE901DOC/SERVER.901/A90125/SQL_ELEMENTS4.HTM#48515)


 


3. 字元到日期操作



select to_date('2003-10-17 21:15:37','yyyy-mm-dd hh24:mi:ss') from dual


具體用法和上面的 to_char 差不多。


4.TO_NUMBER 
使用TO_NUMBER函式將字元轉換為數字 
TO_NUMBER(char[, '格式'])


數字格式格式 
9 代表一個數字 
0 強制顯示0 
$ 放置一個$符 
L 放置一個浮動本地貨幣符 
. 顯示小數點 
, 顯示千位指示符


oracle中的to_date引數含義
 
  1.日期格式引數含義說明  
D 一週中的星期幾  
DAY 天的名字,使用空格填充到9個字元  
DD 月中的第幾天  
DDD 年中的第幾天  
DY 天的簡寫名  
IW ISO標準的年中的第幾周  
IYYY ISO標準的四位年份  
YYYY 四位年份  
YYY,YY,Y 年份的最後三位,兩位,一位  
HH 小時,按12小時計  
HH24 小時,按24小時計  
MI 分  
SS 秒  
MM 月  
Mon 月份的簡寫  
Month 月份的全名  
W 該月的第幾個星期  
WW 年中的第幾個星期     1.日期時間間隔操作
當前時間減去7分鐘的時間
select sysdate,sysdate - interval ’7’ MINUTE from dual
當前時間減去7小時的時間
select sysdate - interval ’7’ hour from dual
當前時間減去7天的時間
select sysdate - interval ’7’ day from dual
當前時間減去7月的時間
select sysdate,sysdate - interval ’7’ month from dual
當前時間減去7年的時間
select sysdate,sysdate - interval ’7’ year from dual
時間間隔乘以一個數字
select sysdate,sysdate - 8 *interval ’2’ hour from dual
   2.日期到字元操作 
select sysdate,to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-mm-dd hh:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-ddd hh:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-mm iw-d hh:mi:ss’) from dual
參考oracle的相關關文件(ORACLE901DOC/SERVER.901/A90125/SQL_ELEMENTS4.HTM#48515)
   3. 字元到日期操作 
select to_date(’2003-10-17 21:15:37’,’yyyy-mm-dd hh24:mi:ss’) from dual
具體用法和上面的to_char差不多。
   4. trunk/ ROUND函式的使用 
select trunc(sysdate ,’YEAR’) from dual
select trunc(sysdate ) from dual
select to_char(trunc(sysdate ,’YYYY’),’YYYY’) from dual
    5.oracle有毫秒級的資料型別 
--返回當前時間 年月日小時分秒毫秒
select to_char(current_timestamp(5),’DD-MON-YYYY HH24:MI:SSxFF’) from dual;
--返回當前時間的秒毫秒,可以指定秒後面的精度(最大=9)
select to_char(current_timestamp(9),’MI:SSxFF’) from dual;
   6.計算程式執行的時間(ms) 
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for I in 1 .. 1000
loop
open l_rc for
’select object_name from all_objects ’||
’where object_id = ’ || i;
fetch l_rc into l_dummy;
close l_rc;
end loop;
dbms_output.put_line
( round( (dbms_utility.get_time-l_start)/100, 2 ) ||
’ seconds ...’ );
  end;
(以下部分轉自網路) 1)to_char 
    數值、日期->字元型 
    語法:to_char(num|date,[format mask],[nls_parameters]) 
    引數:num|date 待轉換的數值或者日期 
             format mask:可選引數


數字->字元型的可用格式
格式元素
元素說明
格式
數字
字元結果


9


數字寬度


9999


12


12


0


顯示前面的零


09999


0012


00012


.


小數點的位置


09999.999


030.40


00030.400


D


小數點分隔符的位置(預設為句點)


09999D999


030.40


00030.400


,


逗號的位置


09999,999


03040


00003,040


G


組分隔符的位置(預設為逗號)


09999G999


03040


00003,040


$


美元符號


$099999


03040


$003040


L


當地貨幣


L099999


03040


GBP003040如果nls_currency設定為GBP


MI


表示負數的減號的位置


99999MI


-3040


3040-


PR


包圍在括號內的負數


99999PR


-3040


<3040>


EEEE


科學計數法


99.99999EEEE


121.976


1.21976E+02


U


Nls_dual_currency


U099999


03040


CAD003040如果nls_dual_currency設定為CAD


V


乘以10n次(n是V之後9的數量)


9999V99


3040


304000


S


前面加上+或者-


S999999


3040


+3040


  


日期->字元型的可用格式(示例日期:02-JUN-1975)


格式說明


說明


結果


Y


年的最後一位


5


YY


年的最後兩位


75


YYY


年的最後三位


975


YYYY


四位數字表示的年


1975


RR


兩位數字表示的年


75


YEAR


區別大小寫並用英語拼寫的年


NINETEEN SEVENTY-FIVE


MM


兩位數表示的月


06


MON


月的三個字母縮寫


JUN


MONTH


區分大小寫並用英語拼寫的月


JUNE


D


星期幾


2


DD


月的兩位數日(即是本月的第幾天)


02


DDD


年的日


153


DY


星期的三個字母縮寫


MON


DAY


區分大小寫並用英語拼寫的星期


MONDAY


 


其他不常用的格式掩碼


演示資料:24-SEP-1000 BC


 


格式元素


說明


結果


W


月的週數


4


WW


年的週數


39


Q


年的季度


3


CC


世紀


10


S preceding CC,YYYY,YEAR


如果日期是BC,那麼減號就在結果之前


-10,-1000或者-ONE THOUSAND


IYYY,IYY,IY,I


分別表示4,3,2,1為ISO日期


1000,000,00,0


BC,AD,B.C. and A.D.


 


 


J


儒略日—從公元前4713年12月31日開始的天數


1356075


IW


ISO標準周(1到53)


39


RM


用羅馬數字表示的月


IX


 


時間元件的日期格式掩碼


演示資料:27-JUN-2010 21:35:13


 


格式元素


說明


結果


AM,PM,A.M.和P.M.


子午線指示器


PM


HH,HH12,HH24


一天的小時,1-12時和0-23時


09,09,21


MI


分(0-59)


35


SS


秒(0-59)


12


SSSSS


午夜之後的秒(0-86399)


77713


 


其他日期格式掩碼


格式元素


說明和格式掩碼


結果


-/.,?#!


標點符號:’MM.YY’


09.08


“any character literal”


字元值:’”Week” W “”of” Month’


Week 2 of September


TH


位置或者序數文字:’DDth”of”Month’


12TH of September


SP


拼寫出數字:’MmSP Month YYYYSP’


Nine September Two Thousand Eight


THSP or SPTH


拼寫出位置或者序數:’hh24SpTh’


Fourteenth


 


2)to_date


字元值->日期值 
語法:to_date (string,[format mask],[nls_parameters]) 
引數:string 待轉換的字元值 
        format mask:可選引數 ,格式掩碼同to_char轉換為date時相同。


備註:轉換時要根據給定的string設定正確的格式掩碼,否則


        Ora_01840:input value is not long enough for date format.


        Ora_01862:the numeric value does not match the length of the format item.


3) to_number


字元值->數字值 
語法:to_number (string,[format mask],[nls_parameters]) 
引數:string 待轉換的字元值 
        format mask:可選引數,格式掩碼同to_char轉換為number時相同。


備註:如果使用較短的格式掩碼就會返回錯誤。


        例如: to_number(123.56,’999.9’)返回錯誤。


 


在oracle中,如果不同的資料型別之間關聯,如果不顯式轉換資料,則它會根據以下規則對資料進行隱式轉換


1) 對於INSERT和UPDATE操作,oracle會把插入值或者更新值隱式轉換為欄位的資料型別。


   假如id列的資料型別為number


   update t set id='1'; -> 相當於 update t set id=to_number('1');


   insert into t(id) values('1') -> insert into t values(to_number('1'));


 


2) 對於SELECT語句,oracle會把欄位的資料型別隱式轉換為變數的資料型別。
   如假設id列的資料型別為varchar2


   select * from t where id=1; -> select * from t where to_number(id)=1;


   但如果id列的資料型別為number,則


   select * from t where id='1'; -> select * from t where id=to_number('1');(參考下文)


 


3) 當比較一個字元型和數值型的值時,oracle會把字元型的值隱式轉換為數值型。


    如假設id列的資料型別為number


    select * from t where id='1'; -> select * from t where id=to_number('1');


 


4) 當比較字元型和日期型的資料時,oracle會把字元型轉換為日期型。


    如假設create_date為字元型,


    select * from t where create_date>sysdate; -> select * from t where to_date(create_date)>sysdate;(注意,此時session的nls_date_format需要與字串格式相符)


    假設create_date為date型,


    select * from t where create_date>'2006-11-11 11:11:11'; -> select * from t where   create_date>to_date('2006-11-11 11:11:11'); (注意,此時session的nls_date_format需要與字串格式相符)


 


5) 如果呼叫函式或過程等時,如果輸入引數的資料型別與函式或者過程定義的引數資料型別不一直,則oracle會把輸入引數的資料型別轉換為函式或者過程定義的資料型別。


   如假設過程如下定義 p(p_1 number)


   exec p('1'); -> exec p(to_number('1')); 6)


   賦值時,oracle會把等號右邊的資料型別轉換為左邊的資料型別。


   如 var a number a:='1'; - > a:=to_number('1');


 


6) 用連線操作符(||)時,oracle會把非字元型別的資料轉換為字元型別。


    select 1||'2' from dual; -> select to_char(1)||'2' from dual;


 


7) 如果字元型別的資料和非字元型別的資料(如number、date、rowid等)作算術運算,則oracle會將字元型別的資料轉換為合適的資料型別,這些資料型別可能是number、date、rowid等。


    如果CHAR/VARCHAR2 和NCHAR/NVARCHAR2之間作算術運算,


    則oracle會將她們都轉換為number型別的資料再做比較。


 


8) 比較CHAR/VARCHAR2 和NCHAR/NVARCHAR2時,如果兩者字符集不一樣,則預設的轉換方式是將資料編碼從資料庫字符集轉換為國家字符集。

相關推薦

VHDL資料型別轉換與移位(STD_LOGIC_ARITH與NUMERIC_STD)

1. VHDL目前常用庫檔案 目前寫VHDL程式時,大部分人已經熟悉的庫呼叫如下所示: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsi

JavaScript資料型別轉換

在js中,資料型別轉換分為顯式資料型別轉換和隱式資料型別轉換。 1, 顯式資料型別轉換 a:轉數字: 1)Number轉換: 程式碼: var a = “123”; a = Number(a);   注意: a) 如果轉

在Talend 的tMap元件資料型別轉換函式總結(一)

1.1 字串與數值型別相互轉換 1.1.1 字串轉為浮點型、整形 1)Float.parseFloat(row3.working_time ) Float.valueOf(String s) Float.valueOf(int s) 2)Integer.pars

Arduino資料型別轉換 float/double轉換為char 親測好使,dtostrf()函式

       如何輕鬆玩轉Arduino微控制器,當我在進行資料轉換的時候,遇到了問題,嘗試了C語言和C++中的好多函式,都沒有達到將float型資料轉換為char型的目的。苦苦查閱資料後,終於找到了一

js資料型別轉換的三種方法 重要

方法主要有三種 轉換函式、強制型別轉換、利用js變數弱型別轉換。 1. 轉換函式: js提供了parseInt()和parseFloat()兩個轉換函式。前者把值轉換成整數,後者把值轉換成浮點數。只有對String型別呼叫這些方法,這兩個函式才能正確執行;對其他型別返回的都是NaN(Not a Nu

vba資料型別轉換函式

轉換函式 CBool(expression) 轉換為Boolean型 CByte(expression) 轉換為Byte型 CCur(expression) 轉換為Curr

python資料型別轉換的使用

常用的資料型別轉換 函式 說明 int(x [,base ]) 將x轉換為一個整數 long(x [,base ]) 將x轉換為一個長整數(注意python3中沒有long了

ACCESS sql語句資料型別轉換 文字型別轉換為數字型別

string sql = "select top 5 * from Dcms_Intro where Intro_CateId=931 order by cint(Intro_ExFlag5) desc " ;// 這

java資料型別轉換

1如何將字串 String 轉換成整數 int? A. 有兩個方法: 1). int i = Integer.parseInt([String]); 或  i = Integer.parseInt([String],[int radix]); 2). int i = Integer.valueOf(m

資料庫SQL資料型別轉換

oracle有三種最基本的資料型別,即字元型、數值型、日期型。 (注意需要起別名的地方要起別名) oracle提供的單行函式中,針對不同的資料型別,提供大量實用的函式,同時提供一系列資料型別轉換函式,如下: sql.append(" select CURVE_NAME,S_

SQL資料庫資料型別ntext和text的區別

4、NCHAR、NVARCHAR、NTEXT。這三種從名字上看比前面三種多了個“N”。它表示儲存的是Unicode資料型別的字元。我們知道字元中,英文字元只需要一個位元組儲存就足夠了,但漢字眾多,需要兩個位元組儲存,英文與漢字同時存在時容易造成混亂,Unicode字符集就是為了解決字符集這種不相容的問題而產生

java的基本資料型別轉換

1.java中的基本資料型別轉換 java基本資料型別的轉換是需要兩個基本事項: 1.boolean型不進行型別轉換。 2.Java中基本資料型別按精度從“低”到“高”排列順序     byte  short  char  int&

matlab圖片資料型別轉換uint8與double

matlab中處理影象畫素點資料: img1=double(imread('lenna.bmp')); matlab中imshow圖片,要先轉換成uint8: subplot(1,2,1),imshow(uint8(img1)),title('original');subplot(1,2,2),imsh

AndroidJNI使用詳解(4)---Java與C之間資料型別轉換

Jni中基本型別轉換對應的表格 Java型別 本地型別 說明 boolean jboolean 無符號,8位 byte jbyte

java筆試題:關於short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;存在的簡單資料型別轉換問題的理解

面試題的內容大概是這樣:short s1=1;s1=s1+1;這兩句程式碼有什麼問題?short s1=1;s1+=1;這兩句程式碼有什麼問題?short s1=1,s2=1;short s3=s1+s2;這兩句程式碼有什麼問題? 下面我就對這三個問題按照自己的理解以及參考做出解釋: 解釋之

SQLServer之資料庫型別對應Java資料型別

SQL Server 型別 JDBC 型別 (java.sql.Types) Java 語言型別 bigint BIGINT long timestamp binary

Python資料型別轉換舉例及指令碼統計伺服器記憶體例項

統計系統剩餘的記憶體      In [1]: s1 = 'abc'     In [2]: help(s1.startswith)     Hel

演算法設計常用的規律性資料型別轉換

案例一: 1/2 錯誤寫法: double a= 1/2  正確寫法: double a=1/2*1.0;    答案為0.5   案例二: 字元轉int    &nbs

Python(5)_Python資料型別轉換

自動型別轉換 # 自動型別轉換,隱式轉換 # 不需要人工干預 # 自動型別轉換多發生在運算或者是判斷過程當中 intval = 123 floatval = 11.1 result = intval*floatval print(result) #if 語句 if True: print(1

Java資料型別轉換

/** * 資料型別的相互轉換 * */ public class DataTypeTranfer { public static void main(String[] args) { /** * 每個型別額轉換都有不止一種方式轉換 * 在我認為最方便的就是裝箱拆箱轉換。把