oracle與sqlserver利用函數生成年月日加流水號

最近在作oracle相關的項目,剛接觸oracle,與sqlserver語法上仍是有區別的sql

sqlserver :oracle

示例:FX+當前年月日+00001函數

以下圖流水號實力所示sqlserver

原理:編碼

首先 'FX'是固定的,獲取當前年月日方法在sqlserver中分別是:spa

1.年:YEAR(GETDATE())code

2.月:month(getdate())server

3.日:DAY(GETDATE())blog

其次最主要的是流水號自動加1,主要思路是獲取到當前表中FxNum最大的數(後6位最大的數),而且用right函數獲取後6位而且加1。開發

 sql函數代碼以下:

Create function [dbo].[f_GetFxNum]()
returns varchar(15)
as
begin
declare @FxNum varchar(15)
declare @time varchar(8)
set @time=CONVERT(varchar,YEAR(GETDATE()))+RIGHT('00'+CONVERT(varchar,month(getdate())),2)+CONVERT(varchar,DAY(GETDATE()))--取到當前年月日
select @FxNum='FX'+@time+RIGHT(100000+ISNULL(RIGHT(MAX(FxNum),5),0)+1,5)--獲取當前表最大值並加1
from PX_FxRecord
return @FxNum
end

ALTER TABLE PX_FxRecord ADD DEFAULT ([dbo].[f_GetFxNum]()) FOR FxNum --將該函數綁定到FxNum做爲該字段的默認值

參數說明:

Right(str,len) -字段返回最右邊的len個字符的字符串str
MAX()    -字段中最大的值
IsNull()    -判斷內容是否爲空

convert()       -格式轉換

Oracle:

oracle比sql語法上簡單精煉一點,其實思路都同樣,編碼模式以'FX'開頭後8位年月日再加8位流水號,在該表中查詢當日最大號加1,若沒有,則從系統時間最小數開始(FX+當前年月日+000001),一直加1.

sql中的right函數在oracle中用substr代替

oracle函數代碼以下:

 

create or replace function f_GetFxNum
return nvarchar2
as
 FxNum nvarchar2(16);
begin
SELECT 'FX'||(NVL(MAX(SUBSTR(FxNum,3,14)),TO_CHAR(SYSDATE,'YYYYMMDD')||'000000')+1) into FxNum FROM PX_FxRecord   WHERE SUBSTR(FxNum,3,8)=TO_CHAR(SYSDATE,'YYYYMMDD') ;
return FxNum;
end;

 

 

 

參數說明:

1.substr(str,截取開始位置,len) //返回截取的字, right(str,len) 返回從最右邊開始len個字符串

2.TO_CHAR(SYSDATE,'YYYYMMDD') //返回當前年月日

3.NVL() // NVL(str1,str2) 若是oracle第一個參數爲空那麼顯示第二個參數的值,若是第一個參數的值不爲空,則顯示第一個參數原本的值。

總結

1.oracle和sqlserver思想原理都差很少,基於sql開發,只是語法實現方式上不一樣。

2.固然實現流水號不止函數這種方式,也能夠利用存儲過程來實現,有興趣的朋友能夠研究下。

相關文章
相關標籤/搜索