青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

DB2的日期和時(shí)間

Posted on 2008-10-21 11:16 Prayer 閱讀(1971) 評(píng)論(0)  編輯 收藏 引用 所屬分類: DB2

1 基礎(chǔ)知識(shí)
2 日期函數(shù)
3 修改日期格式
4 客戶化日期/時(shí)間格式
5 小節(jié)

這篇文章目的是讓DB2的初學(xué)者了解DB2中的日期和時(shí)間的應(yīng)用,相信使用過(guò)其它數(shù)據(jù)庫(kù)的大部分人都會(huì)很驚喜地發(fā)現(xiàn)在DB2中操作日期和時(shí)間是多么簡(jiǎn)單。
本文適用于 IBM DB2 Universal Database for Linux、UNIX 和 Windows。

 
1 基礎(chǔ)知識(shí)
為了用SQL語(yǔ)句得到當(dāng)前的日期,時(shí)間和時(shí)間戳,可以使用相應(yīng)的DB2寄存器:

SELECT current date FROM sysibm.sysdummy1
SELECT current time FROM sysibm.sysdummy1
SELECT current timestamp FROM sysibm.sysdummy1

sysibm.sysdummy1表是一個(gè)在內(nèi)存中特殊的表,可以使用上面的語(yǔ)句得到DB2寄存器的值。您也還可以用關(guān)鍵字VALUES來(lái)獲取寄存器中的值。例如,在DB2命令行處理器中,可以用下面的SQL語(yǔ)句獲取同樣的信息:

VALUES current date
VALUES current time
VALUES current timestamp

在下面的示例中,我將只提供函數(shù)或表達(dá)式,而不再重復(fù) SELECT ... FROM sysibm.sysdummy1 或使用VALUES子句。

要使當(dāng)前時(shí)間或當(dāng)前時(shí)間戳調(diào)整到格林威治標(biāo)準(zhǔn)時(shí)間(GMT/CUT),可以把當(dāng)前的時(shí)間或時(shí)間戳減去當(dāng)前時(shí)區(qū)寄存器:

current time - current timezone
current timestamp - current timezone

給定了日期、時(shí)間或時(shí)間戳,則使用適當(dāng)?shù)暮瘮?shù)抽取出(如果適用的話)年、月、日、時(shí)、分、秒及微秒各部分:

YEAR (current timestamp)
MONTH (current timestamp)
DAY (current timestamp)
HOUR (current timestamp)
MINUTE (current timestamp)
SECOND (current timestamp)
MICROSECOND (current timestamp)

從時(shí)間戳單獨(dú)抽取出日期和時(shí)間也非常簡(jiǎn)單:

DATE (current timestamp)
TIME (current timestamp)

您還可以使用英語(yǔ)(因?yàn)闆](méi)有更好的術(shù)語(yǔ))來(lái)執(zhí)行日期和時(shí)間計(jì)算:

current date + 1 YEAR
current date + 3 YEARS + 2 MONTHS + 15 DAYS
current time + 5 HOURS - 3 MINUTES + 10 SECONDS

要計(jì)算兩個(gè)日期之間相差的天數(shù),您可以對(duì)日期作減法,例如:

days (current date) - days (date('1999-10-22'))

而以下示例描述了如何獲得微秒部分歸零的當(dāng)前時(shí)間戳記:

CURRENT TIMESTAMP - MICROSECOND (current timestamp) MICROSECONDS

如果想將日期或時(shí)間值與其它文本相銜接,那么需要先將該值轉(zhuǎn)換成字符串。為此,可以方便地使用CHAR()函數(shù):

char(current date)
char(current time)
char(current date + 12 hours)

要將字符串轉(zhuǎn)換成日期或時(shí)間值,可以使用:

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:00')
TIME ('12.00.00')

TIMESTAMP()、DATE()和TIME()函數(shù)接受更多種格式。上面幾種格式只是示例,我將把它作為一個(gè)練習(xí),讓讀者自己去發(fā)現(xiàn)其它格式。

警告:
引用自Graeme Birchall著《 DB2 UDB V8.1 SQL Cookbook》
(http://ourworld.compuserve.com/homepages/Graeme_Birchall).

如果在DATE函數(shù)中忘記加單引號(hào)會(huì)發(fā)生什么呢?函數(shù)依然可以執(zhí)行,可是結(jié)果是錯(cuò)的:

SELECT DATE(2001-09-22) FROM SYSIBM.SYSDUMMY1;

結(jié)果:
======
05/24/0006

為什么會(huì)有2000多年的差別呢?
當(dāng)日期DATE函數(shù)讀取字符作為輸入的時(shí)候,它會(huì)將它轉(zhuǎn)換為相應(yīng)的DB2日期;如果讀取的是數(shù)字,就會(huì)把其轉(zhuǎn)換為從0001-01-01日起到該數(shù)字的那一天,上面的例子中,2001-09-22=1970,也就是0001-01-01后的第1970天。

2 日期函數(shù)
有時(shí),您需要知道兩個(gè)時(shí)間戳記之間的時(shí)差。為此,DB2 提供了一個(gè)名為TIMESTAMPDIFF()的內(nèi)置函數(shù)。但該函數(shù)返回的是近似值,因?yàn)樗豢紤]閏年,而且假設(shè)每個(gè)月只有 30 天。以下示例描述了如何得到兩個(gè)日期的近似時(shí)差:

timestampdiff (<n>, char(
timestamp('2002-11-30-00.00.00')-
timestamp('2002-11-08-00.00.00')))

對(duì)于 <n>,可以使用以下各值來(lái)替代,以指出結(jié)果的時(shí)間單位:

1 = 秒的小數(shù)部分
2 = 秒
4 = 分
8 = 時(shí)
16 = 天
32 = 周
64 = 月
128 = 季度
256 = 年

當(dāng)日期很接近時(shí)使用timestampdiff()比日期相差很大時(shí)精確。如果需要進(jìn)行更精確的計(jì)算,可以使用以下方法來(lái)確定時(shí)差(按秒計(jì)):

(DAYS(t1) - DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))

為方便起見,還可以對(duì)上面的方法創(chuàng)建SQL用戶自定義函數(shù):

CREATE FUNCTION secondsdiff(t1 TIMESTAMP, t2 TIMESTAMP)
RETURNS INT
RETURN (
(DAYS(t1) - DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))
)
@

如果需要確定給定年份是否是閏年,這里有一個(gè)很有用的SQL函數(shù),您可以創(chuàng)建它來(lái)確定給定年份的天數(shù):
CREATE FUNCTION daysinyear(yr INT)
RETURNS INT
RETURN (CASE (mod(yr, 400)) WHEN 0 THEN 366 ELSE
CASE (mod(yr, 4)) WHEN 0 THEN
CASE (mod(yr, 100)) WHEN 0 THEN 365 ELSE 366 END
ELSE 365 END
END)@

最后,以下是一張用于日期操作的內(nèi)置函數(shù)表。它旨在幫助您快速確定可能滿足您要求的函數(shù),但未提供完整的參考。
有關(guān)這些函數(shù)的更多信息,請(qǐng)參考SQL Reference。

SQL日期和時(shí)間函數(shù):


DAYNAME :返回一個(gè)大小寫混合的字符串,對(duì)于參數(shù)的日部分,用星期表示這一天的名稱(例如,F(xiàn)riday)。
DAYOFWEEK: 返回參數(shù)中的星期幾,用范圍在 1-7 的整數(shù)值表示,其中 1 代表星期日。
DAYOFWEEK:_ISO 返回參數(shù)中的星期幾,用范圍在 1-7 的整數(shù)值表示,其中 1 代表星期一。
DAYOFYEAR: 返回參數(shù)中一年中的第幾天,用范圍在 1-366 的整數(shù)值表示。
DAYS: 返回日期的整數(shù)表示。
JULIAN_DAY: 返回從公元前 4712 年 1 月 1 日(儒略日歷的開始日期)到參數(shù)中指定日期值之間的天數(shù),用整數(shù)值表示。
MIDNIGHT_SECONDS: 返回午夜和參數(shù)中指定的時(shí)間值之間的秒數(shù),用范圍在 0 到 86400 之間的整數(shù)值表示。
MONTHNAME: 對(duì)于參數(shù)的月部分的月份,返回一個(gè)大小寫混合的字符串(例如,January)。
TIMESTAMP_ISO: 根據(jù)日期、時(shí)間或時(shí)間戳記參數(shù)而返回一個(gè)時(shí)間戳記值。
TIMESTAMP_FORMAT: 從已使用字符模板解釋的字符串返回時(shí)間戳記。
TIMESTAMPDIFF: 根據(jù)兩個(gè)時(shí)間戳記之間的時(shí)差,返回由第一個(gè)參數(shù)定義的類型表示的估計(jì)時(shí)差。
TO_CHAR: 返回已用字符模板進(jìn)行格式化的時(shí)間戳記的字符表示。TO_CHAR: 是 VARCHAR_FORMAT 的同義詞。
TO_DATE: 從已使用字符模板解釋過(guò)的字符串返回時(shí)間戳記。TO_DATE 是 TIMESTAMP_FORMAT 的同義詞。
WEEK: 返回參數(shù)中一年的第幾周,用范圍在 1-54 的整數(shù)值表示。以星期日作為一周的開始。
WEEK_ISO: 返回參數(shù)中一年的第幾周,用范圍在 1-53 的整數(shù)值表示。

3 修改日期格式
我經(jīng)常會(huì)收到關(guān)于日期格式的問(wèn)題。默認(rèn)的日期格式由數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)國(guó)家/地區(qū)代碼(TERRITORY CODE)決定(數(shù)據(jù)庫(kù)國(guó)家/地區(qū)代碼是在數(shù)據(jù)庫(kù)創(chuàng)建時(shí)確定的)。例如,在我的數(shù)據(jù)庫(kù)時(shí)由數(shù)據(jù)庫(kù)國(guó)家/地區(qū)代碼US創(chuàng)建的,時(shí)間格式的輸出如下:

values current date
1
----------
05/30/2003

1 record(s) selected.

即時(shí)間格式為DD/MM/YYYY。如果希望修改格式,您需要使用不同的時(shí)間格式重新聯(lián)編DB2工具包。支持的格式有:

DEF 使用和數(shù)據(jù)庫(kù)國(guó)家/地區(qū)代碼相關(guān)的日期時(shí)間格式。
EUR 使用IBM歐洲標(biāo)準(zhǔn)日期時(shí)間格式。
ISO 使用ISO日期時(shí)間格式。
JIS 使用日本工業(yè)標(biāo)準(zhǔn)日期時(shí)間格式。
LOC 使用和數(shù)據(jù)庫(kù)國(guó)家/地區(qū)代碼結(jié)合的本地日期時(shí)間格式。
USA 使用IBM美國(guó)標(biāo)準(zhǔn)時(shí)間日期格式。


使用下面的步驟修改時(shí)間日期格式為ISO格式(YYYY-MM-DD):

1. 在命令行下,更改到sqllib\bnd目錄。
例如:
在Windows平臺(tái): c:\program files\IBM\sqllib\bnd
在UNIX平臺(tái) : /home/db2inst1/sqllib/bnd

2.以SYSADM組成員的身份連接數(shù)據(jù)庫(kù):
db2 connect to 數(shù)據(jù)庫(kù)名
db2 bind @db2ubind.lst datetime ISO blocking all grant public

(您實(shí)際應(yīng)用中,修改數(shù)據(jù)庫(kù)名和期望的時(shí)間格式)

上面工作完成后,您可以看到日期格式變更為:

values current date
1
----------
2003-05-30

1 record(s) selected.

4 客戶化日期/時(shí)間格式
上面的例子,我們演示了如何修改DB2輸出日期格式為那些本地化的格式。如果您的客戶希望日期格式為YYYYMMDD怎么辦呢?最好的方法時(shí)寫一個(gè)客戶化的格式化函數(shù):

下面時(shí)就時(shí)用戶自定義函數(shù)的例子:
create function ts_fmt(TS timestamp, fmt varchar(20))
returns varchar(50)
return
with 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)),9),
substr( digits (second(TS)),9),
rtrim(char(microsecond(TS)))
from sysibm.sysdummy1
)
select
case 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 ' || coalesce(fmt,' ') ||
' not recognized.'
end
from tmp


這個(gè)公式乍看起來(lái)比較復(fù)雜,細(xì)看一下,您會(huì)發(fā)現(xiàn)它還是很簡(jiǎn)單易用的。首先,使用公共表表達(dá)式(Common Table Expression)將時(shí)間格式中每一個(gè)部分提取出來(lái),然后根據(jù)用戶提供的日期格式重新組裝輸出。這個(gè)函數(shù)很靈活,用戶可以簡(jiǎn)單地添加WHEN子句來(lái)加上期望的日期格式。使用函數(shù)時(shí),如果輸入的日期格式?jīng)]有,函數(shù)還可以輸出出錯(cuò)信息。

例如:
values ts_fmt(current timestamp,'yyyymmdd')
'20030818'
values ts_fmt(current timestamp,'asa')
'date format asa not recognized.'

5 小節(jié)

這些示例回答了我在日期和時(shí)間方面所遇到的最常見問(wèn)題。如果讀者的反饋中認(rèn)為我應(yīng)該用更多示例來(lái)更新本文,那么我會(huì)那樣做的。(事實(shí)上,我已經(jīng)對(duì)本文更新了三次,感謝讀者對(duì)本文的反饋。)

致謝
Bill Wilkins,DB2 Partner Enablement
Randy Talsma

免責(zé)聲明
本文包含樣本代碼。IBM授予您(“被許可方”)使用這個(gè)樣本代碼的非專有的、版權(quán)免費(fèi)的許可證。然而,樣本代碼是以“按現(xiàn)狀”的基礎(chǔ)提供的,不附有任何形式的(不論是明示的,還是默示的)保證,包括對(duì)適銷性、適用于某特定用途或非侵權(quán)性的默示保證。IBM及其許可方不對(duì)被許可方使用該軟件所導(dǎo)致的任何損失負(fù)責(zé)。任何情況下,無(wú)論損失是如何發(fā)生的,也不管責(zé)任條款怎樣,IBM或其許可方都不對(duì)由使用該軟件或不能使用該軟件所引起的收入的減少、利潤(rùn)的損失或數(shù)據(jù)的丟失,或者直接的、間接的、特殊的、由此產(chǎn)生的、附帶的損失或懲罰性的損失賠償負(fù)責(zé),即使IBM已經(jīng)被明確告知此類損害的可能性,也是如此。

關(guān)于作者
Paul Yip是IBM多倫多實(shí)驗(yàn)室的數(shù)據(jù)庫(kù)顧問(wèn),用于各種分布式平臺(tái)的DB2就是該實(shí)驗(yàn)室開發(fā)的。他的工作主要是幫助公司將應(yīng)用程序從其它數(shù)據(jù)庫(kù)遷移到 DB2 以及對(duì)有經(jīng)驗(yàn)的DBA講授如何將他們現(xiàn)有的技能運(yùn)用到DB2世界中。他編寫了多篇DB2文章和白皮書,并喜歡根據(jù)客戶需求來(lái)編寫文章??梢酝ㄟ^(guò) ypaul@ca.ibm.com與Paul聯(lián)系。

 


 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            中日韩在线视频| 午夜精品久久久久| 久热这里只精品99re8久| 男男成人高潮片免费网站| 99国产精品久久| 亚洲精品国久久99热| 国产亚洲高清视频| 国产欧美日韩亚洲一区二区三区| 欧美精品一区二区精品网| 欧美成人精品h版在线观看| 欧美在线一二三四区| 羞羞色国产精品| 欧美亚洲免费在线| 性欧美xxxx大乳国产app| 新67194成人永久网站| 91久久精品一区二区别| 欧美88av| 99精品国产一区二区青青牛奶 | 欧美在线啊v一区| 亚洲一区国产视频| 欧美亚洲三区| 欧美护士18xxxxhd| 欧美日韩在线免费视频| 国产伦精品一区二区三区| 国内精品久久久久久久影视麻豆 | 亚洲丰满少妇videoshd| 亚洲精品国产精品久久清纯直播| 欧美电影在线观看| 欧美伦理91i| 99国产精品99久久久久久| 亚洲一区二区成人在线观看| 久久xxxx| 国产欧美日韩一区二区三区| 亚洲乱码国产乱码精品精天堂 | 午夜精品国产| 欧美一区二区在线观看| 亚洲第一级黄色片| 久久综合国产精品| 国产精品久久久久久久久借妻 | 欧美精品一线| 99精品国产福利在线观看免费| 午夜影院日韩| 国产精品日韩久久久| 亚洲精品欧美日韩| 欧美成人一区二区在线| 欧美伊久线香蕉线新在线| 免费观看成人鲁鲁鲁鲁鲁视频| 好吊妞这里只有精品| 鲁大师影院一区二区三区| 欧美一区二区免费| 亚洲二区视频| 日韩视频在线观看免费| 国产精品免费一区二区三区在线观看 | 欧美精品一区二区在线观看| 亚洲国产另类精品专区 | 性欧美xxxx大乳国产app| 一区二区三区免费观看| 国产精品爱啪在线线免费观看| 性欧美1819sex性高清| 欧美在线视频免费播放| 99成人在线| 久久国产精品久久久久久| 99re6这里只有精品| 午夜在线电影亚洲一区| 亚洲激情婷婷| 亚洲欧美自拍偷拍| 亚洲开发第一视频在线播放| 午夜视频在线观看一区二区| 亚洲国产乱码最新视频| 一个色综合av| 亚洲精品视频在线看| 国产伦精品免费视频 | 亚洲在线免费观看| 欧美一区二区精品| 亚洲国产欧美在线| 久久国产欧美| 久久久久www| 国产精品一区二区久久| 最新国产精品拍自在线播放| 1024国产精品| 久久精品女人| 牛夜精品久久久久久久99黑人| 国产亚洲欧美一区| 香蕉免费一区二区三区在线观看 | 蜜臀va亚洲va欧美va天堂 | 午夜精品久久久久久久久久久久久 | 亚洲综合999| 欧美电影免费观看| 亚洲国产另类 国产精品国产免费| 亚洲欧洲中文日韩久久av乱码| 国产精品久久久久一区二区三区| 欧美激情在线狂野欧美精品| 国产综合在线视频| 久久精品系列| 一区二区三区在线免费观看| 欧美一区二区三区在线看| 亚洲欧美文学| 亚洲国产欧美久久| 欧美日韩美女在线观看| 亚洲中字黄色| 亚洲国产高清一区| 99精品视频免费观看| 国产欧美日韩综合一区在线观看| 亚洲小说欧美另类婷婷| 久久精品国产99| aa级大片欧美| 亚洲第一精品福利| 国产精品久久久久久av下载红粉 | 欧美黄色成人网| 亚洲免费中文字幕| 亚洲国产婷婷综合在线精品| 国产精品美女在线观看| 美女91精品| 久久综合电影| 久久精品亚洲精品国产欧美kt∨| 99精品欧美一区二区蜜桃免费| 久久本道综合色狠狠五月| 亚洲欧美日韩在线播放| 亚洲一区二区不卡免费| 亚洲黄色视屏| 亚洲国产日韩欧美在线图片| 激情综合自拍| 亚洲第一福利视频| 亚洲精品乱码久久久久久蜜桃91| 亚洲激情网址| 亚洲天堂免费观看| 欧美一区二区精品在线| 久久人人97超碰国产公开结果| 久久久久久**毛片大全| 激情成人综合网| 一区二区三区亚洲| 亚洲欧洲三级电影| 一本一道久久综合狠狠老精东影业| 一本不卡影院| 久久永久免费| 中文日韩在线| 欧美1区免费| 国产伦精品一区二区三区在线观看| 国产一区二区黄| 一本色道久久综合| 久久综合九色| 亚洲一区二区高清| 欧美国产日韩精品免费观看| 国产喷白浆一区二区三区| 99国产精品久久久久久久久久| 先锋亚洲精品| 一区二区三区色| 欧美激情一级片一区二区| 国产欧美日韩免费看aⅴ视频| 亚洲品质自拍| 亚洲大胆视频| 欧美a级片网站| 亚洲区第一页| 亚洲天堂黄色| 乱人伦精品视频在线观看| 亚洲综合成人婷婷小说| 欧美视频免费在线| 一本色道久久99精品综合| 欧美成人伊人久久综合网| 久久av红桃一区二区小说| 国产精品一区在线观看| 亚洲欧美影院| 午夜日本精品| 亚洲国产高清一区| 亚洲国产精品999| 欧美日产一区二区三区在线观看 | 久久久久久久精| 伊人久久亚洲热| 亚洲国产99| 久久久国产亚洲精品| 在线国产精品一区| 激情综合在线| 亚洲欧洲久久| 国产精品三上| 欧美不卡视频| 国产精品国产福利国产秒拍| 欧美伊人久久大香线蕉综合69| 欧美一站二站| 亚洲一区二区三区四区视频| 亚洲图色在线| 亚洲国产小视频| 久久成人国产| 99在线|亚洲一区二区| 亚洲伦理一区| 影音先锋久久| 久久久国际精品| 欧美一区二区三区另类| 欧美a级在线| 欧美电影在线观看完整版| 国产精品一区二区三区观看| 亚洲精品久久久久| 亚洲第一在线综合在线| 亚洲欧美在线免费| 午夜精品久久久久久久蜜桃app | 欧美国产先锋| 亚洲成人在线| 欧美激情视频网站| 欧美成人精品一区二区三区| 国产一区二区精品久久91| 亚洲一区制服诱惑|