- 浏览: 237431 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
satanrad:
非常感谢分享,我也碰见一样的问题。还以为机器上的JDK版本过高 ...
Nexus 启动报错(win7 32位 jdk1.6) -
FX夜归人:
FX夜归人 写道能不能解释下 0.50000000001?3Q ...
js格式化金额 -
FX夜归人:
能不能解释下 0.50000000001?3Q
js格式化金额 -
wzmmao:
您好,在问答频道看到您说到DHTMLX,我也是刚接触这个,不知 ...
EXTJS4.0 用法笔记~~ 3种和后台交互数据的方法
简介: 这篇短文说明了如何在 DB2 Universal Database for Windows、UNIX 和 Linux 平台上使用 SQL 操作日期、时间和时间戳记。
这篇短文是为那些刚接触 DB2 并想理解如何操作日期和时间的新手而写的。使用过其它数据库的大部分人都会很惊喜地发现在 DB2 中操作日期和时间是多么简单。
要使用 SQL 获得当前的日期、时间及时间戳记,请参考适当的 DB2 寄存器:
SELECT current date FROM sysibm.sysdummy1 SELECT current time FROM sysibm.sysdummy1 SELECT current timestamp FROM sysibm.sysdummy1 |
sysibm.sysdummy1表是一个特殊的内存中的表,用它可以发现如上面演示的 DB2 寄存器的值。您也可以使用关键字 VALUES 来对寄存器或表达式求值。例如,在 DB2 命令行处理器(Command Line Processor,CLP)上,以下 SQL 语句揭示了类似信息:
VALUES current date VALUES current time VALUES current timestamp |
在余下的示例中,我将只提供函数或表达式,而不再重复 SELECT ... FROM sysibm.sysdummy1
或使用 VALUES 子句。
要使当前时间或当前时间戳记调整到 GMT/CUT,则把当前的时间或时间戳记减去当前时区寄存器:
current time - current timezone current 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 (current timestamp) TIME (current timestamp) |
因为没有更好的术语,所以您还可以使用英语来执行日期和时间计算:
current date + 1 YEAR current date + 3 YEARS + 2 MONTHS + 15 DAYS current time + 5 HOURS - 3 MINUTES + 10 SECONDS |
要计算两个日期之间的天数,您可以对日期作减法,如下所示:
days (current date) - days (date('1999-10-22')) |
而以下示例描述了如何获得微秒部分归零的当前时间戳记:
CURRENT TIMESTAMP - 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:00') TIME ('12.00.00') |
TIMESTAMP()、DATE() 和 TIME() 函数接受更多种格式。上面几种格式只是示例,我将把它作为一个练习,让读者自己去发现其它格式。
警告: 如果你在日期函数中偶然地遗漏了引号,那将如何呢?结论是函数会工作,但结果会出错:
结果:
为什么会产生将近 2000 年的差距呢?当 DATE 函数得到了一个字符串作为输入参数的时候,它会假定这是一个有效的 DB2 日期的表示,并对其进行适当地转换。相反,当输入参数是数字类型时,函数会假定该参数值减 1 等于距离公元第一天(0001-01-01)的天数。在上面的例子中,我们的输入是 2001-09-22,被理解为 (2001-9)-22, 等于 1970 天,于是该函数被理解为 DATE(1970)。 |
有时,您需要知道两个时间戳记之间的时差。为此,DB2 提供了一个名为 TIMESTAMPDIFF() 的内置函数。但该函数返回的是近似值,因为它不考虑闰年,而且假设每个月只有 30 天。以下示例描述了如何得到两个日期的近似时差:
timestampdiff (<n>, char( timestamp('2002-11-30-00.00.00')- timestamp('2002-11-08-00.00.00'))) |
对于 <n>,可以使用以下各值来替代,以指出结果的时间单位:
- 1 = 秒的小数部分
- 2 = 秒
- 4 = 分
- 8 = 时
- 16 = 天
- 32 = 周
- 64 = 月
- 128 = 季度
- 256 = 年
当日期很接近时使用 timestampdiff() 比日期相差很大时精确。如果需要进行更精确的计算,可以使用以下方法来确定时差(按秒计):
(DAYS(t1) - DAYS(t2)) * 86400 + (MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2)) |
为方便起见,还可以对上面的方法创建 SQL 用户定义的函数:
CREATE FUNCTION secondsdiff(t1 TIMESTAMP, t2 TIMESTAMP) RETURNS INT RETURN ( (DAYS(t1) - DAYS(t2)) * 86400 + (MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2)) ) @ |
如果需要确定给定年份是否是闰年,以下是一个很有用的 SQL 函数,您可以创建它来确定给定年份的天数:
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)@ |
最后,以下是一张用于日期操作的内置函数表。它旨在帮助您快速确定可能满足您要求的函数,但未提供完整的参考。有关这些函数的更多信息,请参考 SQL 参考大全。
SQL 日期和时间函数 | |
DAYNAME | 返回一个大小写混合的字符串,对于参数的日部分,用星期表示这一天的名称(例如,Friday)。 |
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 的整数值表示。 |
在日期的表示方面,这也是我经常碰到的一个问题。用于日期的缺省格式由数据库的地区代码决定,该代码在数据库创建的时候被指定。例如,我在创建数据库时使用 territory=US 来定义地区代码,则日期的格式就会像下面的样子:
values current date 1 ---------- 05/30/2003 1 record(s) selected. |
也就是说,日期的格式是 MM/DD/YYYY. 如果想要改变这种格式,你可以通过绑定特定的 DB2 工具包来实现. 其他被支持的日期格式包括:
DEF | 使用与地区代码相匹配的日期和时间格式。 |
EUR | 使用欧洲日期和时间的 IBM 标准格式。 |
ISO | 使用国际标准组织(ISO)制订的日期和时间格式。 |
JIS | 使用日本工业标准的日期和时间格式。 |
LOC | 使用与数据库地区代码相匹配的本地日期和时间格式。 |
USA | 使用美国日期和时间的 IBM 标准格式。 |
在 Windows 环境下,要将缺省的日期和时间格式转化成 ISO 格式(YYYY-MM-DD),执行下列操作:
- 在命令行中,改变当前目录为
sqllib\bnd
。例如:
在 Windows 环境:c:\program files\IBM\sqllib\bnd
在 UNIX 环境:/home/db2inst1/sqllib/bnd
- 从操作系统的命令行界面中用具有 SYSADM 权限的用户连接到数据库:
db2 connect to DBNAME db2 bind @db2ubind.lst datetime ISO blocking all grant public
(在你的实际环境中, 用你的数据库名称和想使用的日期格式分别来替换 DBNAME and ISO。)
现在,你可以看到你的数据库已经使用 ISO 作为日期格式了:
values current date 1 ---------- 2003-05-30 1 record(s) selected. |
在上面的例子中,我们展示了如何将 DB2 当前的日期格式转化成系统支持的特定格式。但是,如果你想将当前日期格式转化成定制的格式(比如‘yyyymmdd’),那又该如何去做呢?按照我的经验,最好的办法就是编写一个自己定制的格式化函数。
下面是这个 UDF 的代码:
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,' <null> ') || ' not recognized.' end from tmp |
乍一看,函数的代码可能显得很复杂,但是在仔细研究之后,你会发现这段代码其实非常简单而且很优雅。最开始,我们使用了一个公共表表达式(CTE)来将一个时间戳记(第一个输入参数)分别剥离为单独的时间元素。然后,我们检查提供的定制格式(第二个输入参数)并将前面剥离出的元素按照该定制格式的要求加以组合。
这个函数还非常灵活。如果要增加另外一种模式,可以很容易地再添加一个 WHEN 子句来处理。在使用过程中,如果用户提供的格式不符合任何在 WHEN 子句中定义的任何一种模式时,函数会返回一个错误信息。
使用方法示例:
values ts_fmt(current timestamp,'yyyymmdd') '20030818' values ts_fmt(current timestamp,'asa') 'date format asa not recognized.' |
这些示例回答了我在日期和时间方面所遇到的最常见问题。如果读者的反馈中认为我应该用更多示例来更新本文,那么我会那样做的。(事实上,我已经对本文更新了三次,不是吗?我要感谢读者的反馈。)
Bill Wilkins,DB2 Partner Enablement
Randy Talsma
<!-- CMA ID: 57629 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->
发表评论
-
db2cmd 命令操作
2013-01-07 14:36 13351、 打开命令行窗口 #db2cmd 2、 ... -
DB2 license过期解决方案
2013-01-07 11:05 5074db2licm -l命令可以查看到db2的license信 ... -
DB2中几种遇到的SQL1032N出错的解决(转)
2013-01-07 10:57 3190使用DB2以来,碰到了几次出现提示SQL1032N错误,每次 ... -
db2 简单DDL操作
2012-09-25 17:24 1292http://pic.dhe.ibm.com/infoce ... -
SQL2216N 重组数据库表或其索引时发生 SQL 错误 "-668" 解决方法
2012-09-19 13:20 8915问题是这么产生的 我对表列长度进行修改,然后中途出现了问题。 ... -
db2卸载-解决因实例原因无法删除的情况
2012-08-27 13:32 1185在db2cmd下使用db2unins /f 可以直接删除 -
db2解挂
2012-08-24 17:46 1345db2 -x "select 's ... -
db2数值类型转换char多0及日期类型转换char处理
2012-08-16 10:43 2713数值类型转换char多0及多空格问题处理 rtrim(cha ... -
db2导出 导入
2012-07-27 15:06 819导出: --导出数据库结构 db2look -d DATA ... -
db2随机查询数据
2012-07-27 15:04 1445db2 随机查询数据select * from CC_PRC_ ... -
oracle程序升级db2
2012-07-27 00:51 1514最近段时间忙于升级(如题),在连续5天的加班下,终于迎来了今天 ... -
关于locate函数
2012-07-12 11:45 16800由于公司最近将oracle项目移植到db2 中间出现了很多兼容 ... -
db2创建数据库脚本
2012-06-21 10:38 2026--在db2cmd下先设置变量db2set DB2_CREAT ...
相关推荐
DB2 基础:日期和时间的使用
这篇短文是为那些刚接触 DB2 并想理解如何操作日期和时间的新手而写的。使用过其它数据库的大部分人都会很惊喜地发现在 DB2 中操作日期和时间是多么简单。
这篇短文是为那些刚接触DB2 并想理解如何操作日期和时间的新手而写的。使用过其它数据库的 大部分人都会很惊喜地发现在DB2 中操作日期和时间是多么简单。
原始数据如上图所示,创建一张Access数据表用以存储以上数据,为每个字段选择适合字段类型 文本 文本 是/否 日期时间 是/否 文本 信息技术基础-数据库管理系统全文共24页,当前为第11页。 12 如果字段的类型是自动...
最好的sql教程 轻举技术之“纲”,张合用之“目”,锻造SQL高可用性数据库应用指南从理论到实践,... A.1 DB2的安装和使用 A.2 MySQL的安装和使用 A.3 Oracle的安装和使用 A.4 Microsoft SQL Server的安装和使用
目录 第1章 数据库入门 1.1 数据库概述 1.1.1 数据库与数据库管理系统 ... A.1 DB2的安装和使用 A.2 MySQL的安装和使用 A.3 Oracle的安装和使用 A.4 Microsoft SQL Server的安装和使用 显示部分信息
目录 第1章 数据库入门 1.1 数据库概述 1.1.1 数据库与数据库管理系统 ... A.1 DB2的安装和使用 A.2 MySQL的安装和使用 A.3 Oracle的安装和使用 A.4 Microsoft SQL Server的安装和使用 显示部分信息
目录 第1章 数据库入门 1.1 数据库概述 1.1.1 数据库与数据库管理系统 ... A.1 DB2的安装和使用 A.2 MySQL的安装和使用 A.3 Oracle的安装和使用 A.4 Microsoft SQL Server的安装和使用 显示部分信息
目录 第1章 数据库入门 1.1 数据库概述 1.1.1 数据库与数据库管理系统 ... A.1 DB2的安装和使用 A.2 MySQL的安装和使用 A.3 Oracle的安装和使用 A.4 Microsoft SQL Server的安装和使用 显示部分信息
置函数主要包括:数学函数、字符串函数、日期时间函数、类型转换函数聚集函数等。 • 支持视图 神通数据库对数据视图提供了完善的支持,从而允许不同的用户或应用程序以不同的方式查看同一数 据。该项功能不仅使数据...
mssql 2000 Access DB2 oracle 【mysql安装】 1、官方下载mysql win32 msi 2、点击安装 3、配置 4、查看是否安装成功 通过cmd 输入netstat -a搜索3306端口是否处于listening状态 【mysql服务的启动与停止】 1...
上架时间:2007-6-22 出版日期:2007 年7月 开本:32开 页码:204 版次:3-1 所属分类: 计算机 > 数据库 > SQL语言 编辑推荐 SQL经典畅销书 涵盖所有主流数据库 学习与参考皆宜... 内容简介 sql ...
渠道发展用户日分析: 通过时间、地域、品牌、地理位置类型、排他性等角度分析各类渠道每日新增及离网用户的情况,实现对渠道的整体分析和监控。 支持切片、钻取,旋转等分析操作,以图表形式展现, 能够打印图表,并且...
科 技 学 院 课程设计报告 ( 2013-- 2014年度第2学期) 名 称: 数据库原理课程设计 院 系: 信息工程系 班 级: 学 号: 学生姓名: 指导教师: 郭丰娟 王晓辉 设计周数: 1 成 绩: 日期:2014年 5 月29日 《数据库...
推荐:学习SQL编程,必备书籍,从入门到进阶/精通,实例与理论同步,比较优秀作品!(共分压5部分)目录:...D.3 日期和时间数据类型..... 174 D.4 二进制数据类型..... 175 附录E SQL保留字...... 176 索引...... 182
MySQL 和 .Net2.0配合使用 与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable 与DotNet数据对象结合的自定义数据对象设计 (一) 数据对象与DataRow ASP.NET中大结果集的分页[翻译] .net 2.0 访问...
日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...
3. SQL常用命令使用方法: (1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 like \'%字段值%\' order by 字段名 [desc]" ...
有别于传统的数据库 系统,数据仓库通常是一个面向主题的、 集成的、 随时间变化的、 但 信息本身相对稳定的数据集合,它用于对管理决策过程的支持。 这 里的主题,是指用户使用数据仓库进行决策时所关心的重点方面, ...
4.2.1 获得日期时间信息的函数getdate 60 4.2.2 获得当前时间的函数 4.2.2 gettimeofday 61 4.2.3 日期验证函数checkdate 61 4.2.4 格式化本地时间日期的函数date 62 4.2.5 获得本地化时间戳的函数mktime 64 4.2.6 ...