這篇短文是為那些剛接觸_第1頁
這篇短文是為那些剛接觸_第2頁
這篇短文是為那些剛接觸_第3頁
這篇短文是為那些剛接觸_第4頁
這篇短文是為那些剛接觸_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、介紹這篇短文是為那些剛接觸 DB2 并想理解如何操作日期和時間的新手而寫的。使用過其它數據庫的大部分人都會很驚喜地發(fā)現在 DB2 中操作日期和時間是多么簡單?;A要使用 SQL 獲得當前的日期、時間及時間戳記,請參考適當的 DB2 寄存器:SELECT current date FROM sysibm.sysdummy1SELECT current time FROM sysibm.sysdummy1SELECT current timestamp FROM sysibm.sysdummy1sysibm.sysdummy1表是一個特殊的內存中的表,用它可以發(fā)現如上面演示的 DB2 寄存器的值。

2、您也可以使用關鍵字 VALUES 來對寄存器或表達式求值。例如,在 DB2 命令行處理器(Command Line Processor,CLP)上,以下 SQL 語句揭示了類似信息: VALUES current dateVALUES current timeVALUES current timestamp在余下的示例中,我將只提供函數或表達式,而不再重復 SELECT . FROM sysibm.sysdummy1 或使用 VALUES 子句。 要使當前時間或當前時間戳記調整到 GMT/CUT,則把當前的時間或時間戳記減去當前時區(qū)寄存器:current time - current time

3、zonecurrent timestamp - current timezone給定了日期、時間或時間戳記,則使用適當的函數可以單獨抽取出(如果適用的話)年、月、日、時、分、秒及微秒各部分:YEAR (current timestamp)MONTH (current timestamp)DAY (current timestamp)HOUR (current timestamp)MINUTE (current timestamp)SECOND (current timestamp)MICROSECOND (current timestamp)從時間戳記單獨抽取出日期和時間也非常簡單:DATE

4、(current timestamp)TIME (current timestamp)因為沒有更好的術語,所以您還可以使用英語來執(zhí)行日期和時間計算:current date + 1 YEARcurrent date + 3 YEARS + 2 MONTHS + 15 DAYScurrent time + 5 HOURS - 3 MINUTES + 10 SECONDS要計算兩個日期之間的天數,您可以對日期作減法,如下所示:days (current date) - days (date(1999-10-22)而以下示例描述了如何獲得微秒部分歸零的當前時間戳記:CURRENT TIMESTAMP

5、 - MICROSECOND (current timestamp) MICROSECONDS如果想將日期或時間值與其它文本相銜接,那么需要先將該值轉換成字符串。為此,只要使用 CHAR() 函數:char(current date)char(current time)char(current date + 12 hours)要將字符串轉換成日期或時間值,可以使用:TIMESTAMP (2002-10-20-12.00.00.000000)TIMESTAMP (2002-10-20 12:00:00)DATE (2002-10-20)DATE (10/20/2002)TIME (12:00:0

6、0)TIME (12.00.00)TIMESTAMP()、DATE() 和 TIME() 函數接受更多種格式。上面幾種格式只是示例,我將把它作為一個練習,讓讀者自己去發(fā)現其它格式。警告: 摘自 DB2 UDB V8.1 SQL Cookbook,作者 Graeme Birchall(see 如果你在日期函數中偶然地遺漏了引號,那將如何呢?結論是函數會工作,但結果會出錯:SELECT DATE(2001-09-22) FROM SYSIBM.SYSDUMMY1;結果:=05/24/0006為什么會產生將近 2000 年的差距呢?當 DATE 函數得到了一個字符串作為輸入參數的時候,它會假定這是一

7、個有效的 DB2 日期的表示,并對其進行適當地轉換。相反,當輸入參數是數字類型時,函數會假定該參數值減 1 等于距離公元第一天(0001-01-01)的天數。在上面的例子中,我們的輸入是 2001-09-22,被理解為 (2001-9)-22, 等于 1970 天,于是該函數被理解為 DATE(1970)。 日期函數有時,您需要知道兩個時間戳記之間的時差。為此,DB2 提供了一個名為 TIMESTAMPDIFF() 的內置函數。但該函數返回的是近似值,因為它不考慮閏年,而且假設每個月只有 30 天。以下示例描述了如何得到兩個日期的近似時差:timestampdiff (, char(times

8、tamp(2002-11-30-00.00.00)-timestamp(2002-11-08-00.00.00)對于 ,可以使用以下各值來替代,以指出結果的時間單位: 1 = 秒的小數部分 2 = 秒 4 = 分 8 = 時 16 = 天 32 = 周 64 = 月 128 = 季度 256 = 年 當日期很接近時使用 timestampdiff() 比日期相差很大時精確。如果需要進行更精確的計算,可以使用以下方法來確定時差(按秒計):(DAYS(t1) - DAYS(t2) * 86400 + (MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2)為方便起見

9、,還可以對上面的方法創(chuàng)建 SQL 用戶定義的函數:CREATE FUNCTION secondsdiff(t1 TIMESTAMP, t2 TIMESTAMP)RETURNS INTRETURN (DAYS(t1) - DAYS(t2) * 86400 + (MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2)如果需要確定給定年份是否是閏年,以下是一個很有用的 SQL 函數,您可以創(chuàng)建它來確定給定年份的天數:CREATE FUNCTION daysinyear(yr INT)RETURNS INTRETURN (CASE (mod(yr, 400) WHEN

10、0 THEN 366 ELSE CASE (mod(yr, 4) WHEN 0 THEN CASE (mod(yr, 100) WHEN 0 THEN 365 ELSE 366 END ELSE 365 ENDEND)最后,以下是一張用于日期操作的內置函數表。它旨在幫助您快速確定可能滿足您要求的函數,但未提供完整的參考。有關這些函數的更多信息,請參考 SQL 參考大全。SQL 日期和時間函數DAYNAME返回一個大小寫混合的字符串,對于參數的日部分,用星期表示這一天的名稱(例如,Friday)。DAYOFWEEK返回參數中的星期幾,用范圍在 1-7 的整數值表示,其中 1 代表星期日。DAYO

11、FWEEK_ISO返回參數中的星期幾,用范圍在 1-7 的整數值表示,其中 1 代表星期一。DAYOFYEAR返回參數中一年中的第幾天,用范圍在 1-366 的整數值表示。DAYS返回日期的整數表示。JULIAN_DAY返回從公元前 4712 年 1 月 1 日(儒略日歷的開始日期)到參數中指定日期值之間的天數,用整數值表示。MIDNIGHT_SECONDS返回午夜和參數中指定的時間值之間的秒數,用范圍在 0 到 86400 之間的整數值表示。MONTHNAME對于參數的月部分的月份,返回一個大小寫混合的字符串(例如,January)。TIMESTAMP_ISO根據日期、時間或時間戳記參數而返

12、回一個時間戳記值。TIMESTAMP_FORMAT從已使用字符模板解釋的字符串返回時間戳記。TIMESTAMPDIFF根據兩個時間戳記之間的時差,返回由第一個參數定義的類型表示的估計時差。TO_CHAR返回已用字符模板進行格式化的時間戳記的字符表示。TO_CHAR 是 VARCHAR_FORMAT 的同義詞。TO_DATE從已使用字符模板解釋過的字符串返回時間戳記。TO_DATE 是 TIMESTAMP_FORMAT 的同義詞。WEEK返回參數中一年的第幾周,用范圍在 1-54 的整數值表示。以星期日作為一周的開始。WEEK_ISO返回參數中一年的第幾周,用范圍在 1-53 的整數值表示。改變

13、日期格式在日期的表示方面,這也是我經常碰到的一個問題。用于日期的缺省格式由數據庫的地區(qū)代碼決定,該代碼在數據庫創(chuàng)建的時候被指定。例如,我在創(chuàng)建數據庫時使用 territory=US 來定義地區(qū)代碼,則日期的格式就會像下面的樣子: values current date1-05/30/20031 record(s) selected.也就是說,日期的格式是 MM/DD/YYYY. 如果想要改變這種格式,你可以通過綁定特定的 DB2 工具包來實現. 其他被支持的日期格式包括: DEF使用與地區(qū)代碼相匹配的日期和時間格式。EUR使用歐洲日期和時間的 IBM 標準格式。ISO使用國際標準組織(ISO)

14、制訂的日期和時間格式。JIS使用日本工業(yè)標準的日期和時間格式。LOC使用與數據庫地區(qū)代碼相匹配的本地日期和時間格式。USA使用美國日期和時間的 IBM 標準格式。在 Windows 環(huán)境下,要將缺省的日期和時間格式轉化成 ISO 格式(YYYY-MM-DD),執(zhí)行下列操作:1. 在命令行中,改變當前目錄為 sqllibbnd 。 例如: 在 Windows 環(huán)境: c:program filesIBMsqllibbnd 在 UNIX 環(huán)境: /home/db2inst1/sqllib/bnd 2. 從操作系統的命令行界面中用具有 SYSADM 權限的用戶連接到數據庫: db2 connect

15、to DBNAMEdb2 bind db2ubind.lst datetime ISO blocking all grant public(在你的實際環(huán)境中, 用你的數據庫名稱和想使用的日期格式分別來替換 DBNAME and ISO。)現在,你可以看到你的數據庫已經使用 ISO 作為日期格式了:values current date1-2003-05-30 1 record(s) selected.定制日期/時間格式在上面的例子中,我們展示了如何將 DB2 當前的日期格式轉化成系統支持的特定格式。但是,如果你想將當前日期格式轉化成定制的格式(比如yyyymmdd),那又該如何去做呢?按照我的

16、經驗,最好的辦法就是編寫一個自己定制的格式化函數。下面是這個 UDF 的代碼:create function ts_fmt(TS timestamp, fmt varchar(20)returns varchar(50)returnwith tmp (dd,mm,yyyy,hh,mi,ss,nnnnnn) as( select substr( digits (day(TS),9), substr( digits (month(TS),9) , rtrim(char(year(TS) , substr( digits (hour(TS),9), substr( digits (minute(TS

17、),9), substr( digits (second(TS),9), rtrim(char(microsecond(TS) from sysibm.sysdummy1 )selectcase fmt when yyyymmdd then yyyy | mm | dd when mm/dd/yyyy then mm | / | dd | / | yyyy when yyyy/dd/mm hh:mi:ss then yyyy | / | mm | / | dd | | hh | : | mi | : | ss when nnnnnn then nnnnnn else date format |

18、 coalesce(fmt, ) | not recognized. endfrom tmp乍一看,函數的代碼可能顯得很復雜,但是在仔細研究之后,你會發(fā)現這段代碼其實非常簡單而且很優(yōu)雅。最開始,我們使用了一個公共表表達式(CTE)來將一個時間戳記(第一個輸入參數)分別剝離為單獨的時間元素。然后,我們檢查提供的定制格式(第二個輸入參數)并將前面剝離出的元素按照該定制格式的要求加以組合。這個函數還非常靈活。如果要增加另外一種模式,可以很容易地再添加一個 WHEN 子句來處理。在使用過程中,如果用戶提供的格式不符合任何在 WHEN 子句中定義的任何一種模式時,函數會返回一個錯誤信息。使用方法示例:values ts_fmt(current timestamp,yyyymmdd) 20030818values ts_fmt(current timestamp,asa) date format asa not recognized.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論