【IT168 服务器学院】IBM Informix Dynamic Server 有一些操纵日期和时间类型的函数。您可以利用这些函数来对业务数据进行更好的处理和分析。还可以添加新的函数,以简化一些基于日期的业务问题的解决方案。日期是一种复杂的信息。它表示一年中特定的一天。可以按星期、月份、季度等将日期分组。这种分组便于比较不同年份在一段特定时期的结果。
Informix Dynamic Server(IDS)提供了一些处理日期的功能。本文回顾当前已有的一些函数,并提供一些附加的有用的函数。
IDS 日期函数
IDS 包含两种“日期”数据类型。一种是 DATE,另一种是 DATETIME。DATE 表示一天,
而 DATETIME 表示一个特定的时刻,其精度可以从年到秒。IDS 提供了以下函数来操纵
这些类型:
DATE(VARCHAR(10)) 返回 DATE 类型
该函数以一个字符串变量为参数,其格式由环境变量 DBDATE 指定,并返回一个 DATE 类型。
US English 地区的缺省格式是“MDY4/”。
DATE(DATETIME) 返回 DATE 类型
这个函数与上一个函数相同,但是其输入参数是可以为任意精度的 DATETIME。
DATE(INTEGER) 返回 DATE 类型
INTEGER 参数表示从 1899 年 12 月 31 日以来的天数。
DAY(DATE) 返回 INTEGER 类型
DAY 函数返回月中的日,格式为 INTEGER。
DAY(DATETIME)
与上一个函数相同,只是这个函数的输入参数为任意精度的 DATETIME。
EXTEND(DATE, precision) 返回 DATETIME 类型
EXTEND 函数调整 DATE 参数的精度,并返回适当的 DATETIME。由于说起来有点儿模糊,这里举一个例子:
EXTEND(DATE(1), YEAR TO SECOND)
EXTEND(DATETIME, precision) 返回 DATETIME 类型
与上一个函数相同,但操作的对象是一个 DATETIME,而不是一个 DATE。
MONTH(DATE) 返回 INTEGER 类型
MONTH 从参数 DATE 中提取出月份。
MONTH(DATETIME) 返回 INTEGER 类型
该函数从任意精度的 DATETIME 中提取出月份。
WEEKDAY(DATE) 返回 INTEGER 类型
WEEKDAY 函数根据指定的 DATE 返回一个 INTEGER,表示星期几。0 表示星期天,6 表示星期六。
WEEKDAY(DATETIME) 返回 INTEGER 类型
与上一个函数相同,但操作对象是 DATETIME。
YEAR(DATE) 返回 INTEGER 类型
该函数从指定的参数 DATE 中提取出年份。
YEAR(DATETIME) 返回 INTEGER 类型
与上一个函数相同,但操作对象是 DATETIME。
MDY(INTEGER, INTEGER, INTEGER) 返回 DATE 类型
该函数根据三个 INTEGER 参数创建一个 DATE。这些参数分别指定月、日和年。
注意,年是四位的整数。
TO_CHAR(DATE, VARCHAR(??)) 返回 VARCHAR(??) 类型
该函数带一个 DATE 参数和一个格式参数,并返回一个表示日期的字符串,该字符串遵从要求的格式。格式字符串可以包括:
%A: 周
%B: 月
%d: 十进制表示的日
%Y: 4 位数表示的年
%R: 按 24 小时计的时间
TO_CHAR(DATE, VARCHAR(??)) 返回 VARCHAR(??) 类型同上。
TO_DATE(VARCHAR(??), VARCHAR(??)) 返回 DATE 类型
这是 TO_CHAR 的逆向操作,使用相同的格式字符串作为第二个参数。
除了上述函数外,还有两个对日期的处理有影响的环境变量:
DBDATE:提供日期的终端用户格式。在 SQL 参考手册(第 3-25 页)中对此有描述。
DBCENTURY:定义当输入两位数而不是 4 位数的日期时,如何将年份展开。可以接受的值有 R、P、F 和 C。它们分别表示 Current、Previous、Future 和 Closest。
如果没有设置 DBCENTURY,则 R 为缺省值。
在 SQL 参考手册(关于 IDS 10.0 的第 3-22 页)中描述了 DBCENTURY。
最后,IDS 定义了两个内建的函数,用于返回当前日期值。CURRENT 返回一个DATETIME 值,而 TODAY 则返回当天的日期。
使用日期函数
前面描述的那些函数提供了输入、输出、格式化和提取信息的功能。我想讨论的第一种有趣的用法是基于字符串的日期的输入。
函数 DATE() 接收一个字符串作为输入,但是根据 DBDATE 和 DBCENTURY 的设置对它进行不同的处理。首先来看 DBCENTURY。
DBCENTURY 的缺省值为 R。这意味着世纪由当前日期的世纪决定。下面的例子假设在缺省的US English 地区运行:
SELECT date("9/2/92") FROM systables WHERE tabid = 1;
(constant)
09/02/2092
1 row(s) retrieved.
如果 DBCENTURY 被设为 P,则所指的世纪是离当前日期最近的一个世纪。按照这种设置,前面的例子变成:
SELECT date("9/2/92") FROM systables WHERE tabid = 1;
(constant)
09/02/1992
1 row(s) retrieved.
DBDATE 环境变量为日期转换提供了另一种可能的变化。对于 US English 地区,它的缺省值为“MDY4/”。这意味着日期字符串的各部分之间以“/”隔开,它们之间的顺序是月、日和年。
注意,预期的年是 4 位数,但是也可以根据 DBCENTURY 设置的规则进行补足。可以修改DBDATE 的值,以使用国际日期格式。则 DBDATE 值将是“Y4MD-”。除了对字符串类型的输入
日期有影响外,这个值还影响日期到字符串的转换:
select order_date from orders WHERE order_num = 1001;
order_date
1998-05-20
1 row(s) retrieved.
要更详细地显示日期,可以使用 TO_CHAR 函数,并像上一节中描述的那样提供一个格式:
select to_char(order_date, "%d %B %Y") from orders WHERE order_num = 1001;
(expression) 20 May 1998
1 row(s) retrieved.
可以使用一些已有的函数来提取诸如月、日之类的值,并在用表达式定义表分段时使用那些值。
也可以在 SQL 语句中将它们用于分组。例如,如果您想了解每月有多少订单,那么可以使用以下语句:
SELECT YEAR(order_date) year, MONTH(order_date) month, COUNT(*) count
FROM orders
GROUP BY 1, 2
ORDER BY 1, 2;