原创-IBM DB2学习笔记-1:日期以及时间的使用

/***********************************************************************
--IBM DB2学习笔记-1:日期以及时间的使用
--彭建军
--2005-12-22 9:56
--测试环境:DB2 UDB V8.2
--适用于 IBM DB2 UDB for Linux、UNIX 和 Windows
--说明:本文介绍了DB2日期以及时间的绝大部分应用
--欢迎转载,但请注明出处。
***********************************************************************/

首先要说的废话是:看完本文后大家会发现,DB2中的日期和时间处理非常简单也非常灵活!
本文中的语句都经过测试,大家可以在命令编辑器中执行以查看结果,笔者的结果集仅供参考。

1、DB2中日期、时间寄存器的使用

--取日期
SELECT CURRENT DATE FROM sysibm.sysdummy1;
--返回数据类型:DATE
--结果集(YYYY-MM-DD): 2005-12-22

--取时间
SELECT CURRENT TIME FROM sysibm.sysdummy1;
--返回数据类型:TIME
--结果集(HH-MM-SS): 10:10:21

--取时间戳记
SELECT CURRENT TIMESTAMP FROM sysibm.sysdummy1;
--返回数据类型:TIMESTAMP
--结果集(YYYY-MM-DD HH-MM-SS XXXXXX): 2005-12-22 10:10:22 187002

说明:sysibm.sysdummy1表是一个特殊的内存中的表,专门用于存储系统日期和时间。
推荐大家使用 VALUES 函数直接来进行操作。
以上的语句可以改写为:

--取日期
VALUES CURRENT DATE;
--取时间
VALUES CURRENT TIME;
--取时间戳记
VALUES CURRENT TIMESTAMP;

2、DB2中日期、时间的常用函数介绍

--取年份
VALUES YEAR(CURRENT TIMESTAMP);
--返回值:2005

--取月份
VALUES MONTH(CURRENT TIMESTAMP);
--返回值:12

--取天
VALUES DAY(CURRENT TIMESTAMP);
--返回值:22

--取星期
VALUES DAYOFWEEK(CURRENT TIMESTAMP);
--返回值:5
--说明:取值范围为1-7,1代表星期日,所以今天是星期四,得出的值为5!

VALUES  DAYNAME(CURRENT TIMESTAMP);
--返回值:星期五

--取小时
VALUES HOUR(CURRENT TIMESTAMP);
--返回值:10

--取分钟
VALUES MINUTE(CURRENT TIMESTAMP);
--返回值:27

--取秒
VALUES SECOND(CURRENT TIMESTAMP);
--返回值:08

--取毫秒
VALUES MICROSECOND(CURRENT TIMESTAMP);
--返回值:890001

说明:以上函数可以直接供大家在存储过程以及自定义函数或者触发器中直接调用,所有返回类型均为 INTEGER

--取日期
VALUES DATE(CURRENT TIMESTAMP);
--返回数据类型:DATE
--返回值:2005-12-22

--取时间
VALUES TIME(CURRENT TIMESTAMP);
--返回数据类型:TIME
--返回值:10:30:48

3、DB2中日期、时间的计算

--取明年的今天
VALUES CURRENT DATE + 1 YEAR;
--返回值:2006-12-12

--取前年的今天(两种写法都合法)
VALUES CURRENT DATE - 2 YEAR;
VALUES CURRENT DATE - 2 YEARS;
--返回值:2003-12-12

--取下一个小时后的时间
VALUES CURRENT TIME + 1 HOUR;
--返回值:11:38:25

--混合应用的示例1
VALUES CURRENT DATE + 2 YEARS - 1 MONTH + 10 DAYS;
--返回值:2007-12-2(笔者的当前日期为:2005-12-22,大家可以自己计算一下)

--混合应用的示例2
VALUES CURRENT TIME + 5 HOURS - 3 MINUTES + 10 SECONDS;
--返回值:15:39:22(笔者的当前时间为:10:42:12,大家可以自己计算一下)

--计算两个日期之间的间隔天数
VALUES DAYS(CURRENT DATE) - DAYS('2005-01-01');
--返回值:355

说明:DB2中日期、时间的计算非常的灵活,大家可以根据实际需求进行自己的计算

4、DB2中日期、时间的类型转换

--将日期、时间类型转换为字符串型
VALUES CHAR(CURRENT DATE);
VALUES CHAR(CURRENT TIMESTAMP);

--将字符串型转换为日期、时间类型
VALUES TIMESTAMP ('2005-12-22-12.00.00.000000');
VALUES TIMESTAMP ('2005-12-22 12:00:00');
VALUES DATE ('2005-12-22');
VALUES DATE ('12/22/2005');--注意:该格式为(MM/DD/YYYY)
VALUES TIME ('12:00:00');
VALUES TIME ('12.00.00');

说明:在实际应用中,TIMESTAMP()、DATE() 和 TIME() 函数接受更多种格式。其他的格式有兴趣的读者可以自己去发现。

--注意:DATE(2005-12-22)和DATE('2005-12-22')虽然都是合法的,但是结果不同!其实DATE(2005-12-22)等价与DATE(1971),具体原因这里就不详细讲述了。

VALUES DATE(2005-12-22)
--返回值:0006-5-25

VALUES DATE('2005-12-22')
--返回值:2005-12-22

5、DB2中日期、时间的补充说明

DAYNAME
返回一个大小写混合的字符串,对于参数的日部分,用星期表示这一天的名称(例如,星期四)。

DAYOFWEEK
返回参数中的星期几,用范围在 1-7 的整数值表示,其中 1 代表星期日。

DAYOFWEEK_ISO
返回参数中的星期几,用范围在 1-7 的整数值表示,其中 1 代表星期一。

DAYOFYEAR
返回参数中一年中的第几天,用范围在 1-366 的整数值表示。

DAYS
返回日期的整数表示。

JULIAN_DAY
返回从公元前 4712 年 1 月 1 日(儒略日历的开始日期)到参数中指定日期值之间的天数,用整数值表示。

MIDNIGHT_SECONDS
返回午夜和参数中指定的时间值之间的秒数,用范围在 0 到 86400 之间的整数值表示。

MONTHNAME
对于参数的月部分的月份,返回一个大小写混合的字符串(例如,January)。

TIMESTAMP_ISO
根据日期、时间或时间戳记参数而返回一个时间戳记值。

TIMESTAMP_FORMAT
从已使用字符模板解释的字符串返回时间戳记。

TIMESTAMPDIFF
根据两个时间戳记之间的时差,返回由第一个参数定义的类型表示的估计时差。

TO_CHAR
返回已用字符模板进行格式化的时间戳记的字符表示。TO_CHAR 是 VARCHAR_FORMAT 的同义词。

TO_DATE
从已使用字符模板解释过的字符串返回时间戳记。TO_DATE 是 TIMESTAMP_FORMAT 的同义词。

WEEK
返回参数中一年的第几周,用范围在 1-54 的整数值表示。以星期日作为一周的开始。

WEEK_ISO
返回参数中一年的第几周,用范围在 1-53 的整数值表示。

说明:在DB2中,日期、时间的函数还有很多,上面只列举了一些常用的函数,如果这些函数不能实现读者的需求,可以自己编写自定义函数。

相信各位读者看完这篇文章之后会对DB2的时间以及日期计算有全新的认识,非常简单,没有骗你哦!

感谢IBM 工程师 Paul Yi,是您的文章让我获益匪浅。

DB2 基础:日期时间使用(zz) IBM

06-24

rnDB2 基础:日期和时间的使用rnrnrnPaul Yip rnIBM Business Partner EnablementrnIBM 多伦多实验室rn2002 年 11 月 rn rn rn rnrn重要:在阅读本文之前请先看一下免责声明。rn本文适用于 IBM® DB2® Universal Database™ for Linux、UNIX® 和 Windows® rnrn这篇短文是为那些刚接触 DB2 并想理解如何操作日期和时间的新手而写的。使用过其它数据库的大部分人都会很惊喜地发现在 DB2 中操作日期和时间是多么简单。rnrn要使用 SQL 获得当前的日期、时间及时间戳记,请参考适当的 DB2 寄存器:rnrnSELECT current date FROM sysibm.sysdummy1rnSELECT current time FROM sysibm.sysdummy1rnSELECT current timestamp FROM sysibm.sysdummy1rnrnsysibm.sysdummy1 表是一个特殊的内存中的表,用它可以发现如上面演示的 DB2 寄存器的值。您也可以使用关键字 VALUES 来对寄存器或表达式求值。例如,在 DB2 命令行处理器(Command Line Processor,CLP)上,以下 SQL 语句揭示了类似信息:rnrnVALUES current daternVALUES current timernVALUES current timestamprnrn在余下的示例中,我将只提供函数或表达式,而不再重复 SELECT ... FROM sysibm.sysdummy1 或使用 VALUES 子句。rnrn要使当前时间或当前时间戳记调整到 GMT/CUT,则把当前的时间或时间戳记减去当前时区寄存器:rnrncurrent time - current timezonerncurrent timestamp - current timezonernrn给定了日期、时间或时间戳记,则使用适当的函数可以单独抽取出(如果适用的话)年、月、日、时、分、秒及微秒各部分:rnrnYEAR (current timestamp)rnMONTH (current timestamp)rnDAY (current timestamp)rnHOUR (current timestamp)rnMINUTE (current timestamp)rnSECOND (current timestamp)rnMICROSECOND (current timestamp)rnrn从时间戳记单独抽取出日期和时间也非常简单:rnrnDATE (current timestamp)rnTIME (current timestamp)rnrn因为没有更好的术语,所以您还可以使用英语来执行日期和时间计算:rnrncurrent date + 1 YEARrncurrent date + 3 YEARS + 2 MONTHS + 15 DAYSrncurrent time + 5 HOURS - 3 MINUTES + 10 SECONDSrnrn要计算两个日期之间的天数,您可以对日期作减法,如下所示:rnrndays (current date) - days (date('1999-10-22'))rnrn而以下示例描述了如何获得微秒部分归零的当前时间戳记:rnrnCURRENT TIMESTAMP - MICROSECOND (current timestamp) MICROSECONDSrnrn如果想将日期或时间值与其它文本相衔接,那么需要先将该值转换成字符串。为此,只要使用 CHAR() 函数:rnrnchar(current date)rnchar(current time)rnchar(current date + 12 hours)rnrn要将字符串转换成日期或时间值,可以使用:rnrnTIMESTAMP ('2002-10-20-12.00.00.000000')rnTIMESTAMP ('2002-10-20 12:00:00')rn DATE ('2002-10-20')rn DATE ('10/20/2002')rn TIME ('12:00:00')rn TIME ('12.00.00')rnrnTIMESTAMP()、DATE() 和 TIME() 函数接受更多种格式。上面几种格式只是示例,我将把它作为一个练习,让读者自己去发现其它格式。rnrn有时,您需要知道两个时间戳记之间的时差。为此,DB2 提供了一个名为 TIMESTAMPDIFF() 的内置函数。但该函数返回的是近似值,因为它不考虑闰年,而且假设每个月只有 30 天。以下示例描述了如何得到两个日期的近似时差:rnrntimestampdiff (, char(rn timestamp('2002-11-30-00.00.00')-rn timestamp('2002-11-08-00.00.00')))rnrn对于 ,可以使用以下各值来替代,以指出结果的时间单位:rnrn1 = 秒的小数部分 rn2 = 秒 rn4 = 分 rn8 = 时 rn16 = 天 rn32 = 周 rn64 = 月 rn128 = 季度 rn256 = 年 rn当日期很接近时使用 timestampdiff() 比日期相差很大时精确。如果需要进行更精确的计算,可以使用以下方法来确定时差(按秒计):rnrn(DAYS(t1) - DAYS(t2)) * 86400 + rn(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))rnrn为方便起见,还可以对上面的方法创建 SQL 用户定义的函数:rnrnCREATE FUNCTION secondsdiff(t1 TIMESTAMP, t2 TIMESTAMP)rnRETURNS INTrnRETURN (rn(DAYS(t1) - DAYS(t2)) * 86400 + rn(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))rn)rn@rnrn如果需要确定给定年份是否是闰年,以下是一个很有用的 SQL 函数,您可以创建它来确定给定年份的天数:rnrnCREATE FUNCTION daysinyear(yr INT)rnRETURNS INTrnRETURN (CASE (mod(yr, 400)) WHEN 0 THEN 366 ELSE rn CASE (mod(yr, 4)) WHEN 0 THEN rn CASE (mod(yr, 100)) WHEN 0 THEN 365 ELSE 366 END rn ELSE 365 ENDrn END)@rnrn最后,以下是一张用于日期操作的内置函数表。它旨在帮助您快速确定可能满足您要求的函数,但未提供完整的参考。有关这些函数的更多信息,请参考 SQL 参考大全。rnrnSQL 日期和时间函数 rnDAYNAME 返回一个大小写混合的字符串,对于参数的日部分,用星期表示这一天的名称(例如,Friday)。 rnDAYOFWEEK 返回参数中的星期几,用范围在 1-7 的整数值表示,其中 1 代表星期日。 rnDAYOFWEEK_ISO 返回参数中的星期几,用范围在 1-7 的整数值表示,其中 1 代表星期一。 rnDAYOFYEAR 返回参数中一年中的第几天,用范围在 1-366 的整数值表示。 rnDAYS 返回日期的整数表示。 rnJULIAN_DAY 返回从公元前 4712 年 1 月 1 日(儒略日历的开始日期)到参数中指定日期值之间的天数,用整数值表示。 rnMIDNIGHT_SECONDS 返回午夜和参数中指定的时间值之间的秒数,用范围在 0 到 86400 之间的整数值表示。 rnMONTHNAME 对于参数的月部分的月份,返回一个大小写混合的字符串(例如,January)。 rnTIMESTAMP_ISO 根据日期、时间或时间戳记参数而返回一个时间戳记值。 rnTIMESTAMP_FORMAT 从已使用字符模板解释的字符串返回时间戳记。 rnTIMESTAMPDIFF 根据两个时间戳记之间的时差,返回由第一个参数定义的类型表示的估计时差。 rnTO_CHAR 返回已用字符模板进行格式化的时间戳记的字符表示。TO_CHAR 是 VARCHAR_FORMAT 的同义词。 rnTO_DATE 从已使用字符模板解释过的字符串返回时间戳记。TO_DATE 是 TIMESTAMP_FORMAT 的同义词。 rnWEEK 返回参数中一年的第几周,用范围在 1-54 的整数值表示。以星期日作为一周的开始。 rnWEEK_ISO 返回参数中一年的第几周,用范围在 1-53 的整数值表示。 rnrn这些示例回答了我在日期和时间方面所遇到的最常见问题。如果读者的反馈中认为我应该用更多示例来更新本文,那么我会那样做的。(事实上,我已经对本文更新了两次,不是吗?我要感谢读者的反馈。)rnrn致谢rnrnrnBill Wilkins,DB2 Partner Enablement rnRandy Talsma rnrn免责声明rnrnrn本文包含样本代码。IBM 授予您(“被许可方”)使用这个样本代码的非专有的、版权免费的许可证。然而,样本代码是以“按现状”的基础提供的,不附有任何形式的(不论是明示的,还是默示的)保证,包括对适销性、适用于某特定用途或非侵权性的默示保证。IBM 及其许可方不对被许可方使用该软件所导致的任何损失负责。任何情况下,无论损失是如何发生的,也不管责任条款怎样,IBM 或其许可方都不对由使用该软件或不能使用该软件所引起的收入的减少、利润的损失或数据的丢失,或者直接的、间接的、特殊的、由此产生的、附带的损失或惩罚性的损失赔偿负责,即使 IBM 已经被明确告知此类损害的可能性,也是如此。rnrn至页首 rnrn关于作者rnrnPaul Yip 是 IBM 多伦多实验室的数据库顾问,用于各种分布式平台的 DB2 就是该实验室开发的。他的工作主要是帮助公司将应用程序从其它数据库迁移到 DB2 以及对有经验的 DBA 讲授如何将他们现有的技能运用到 DB2 世界中。他编写了多篇 DB2 文章和白皮书,并喜欢根据客户需求来编写文章。可以通过 ypaul@ca.ibm.com 与 Paul 联系 rnrnIBM、AIX、DB2 和 DB2 Universal Database 是 IBM 公司在美国和/或其它国家或地区的商标或注册商标。rnrnWindows 是 Microsoft Corporation 在美国和/或其它国家或地区的注册商标。rnrnUNIX 是 The Open Group 在美国和其它国家或地区的注册商标。rnrn其它公司、产品和服务可能是其它公司的商标或服务标记。rnrnIBM 版权和商标信息rn rnrn rn rn rn rn您对这篇文章的看法如何?rnrn真棒! 好文章 一般;尚可 需提高 太差! rnrn意见?rn rnrn rn rn rn rn 关于 IBM | 隐私条约 | 法律条款 | 联系 IBM rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭