日期时间值的字符串表示
日期、时间和时间戳值可以用字符串表示。 对于许多主机语言,没有用于日期时间值的特殊SQL常量,除了Java™之外,也没有数据类型为日期、时间或时间戳的主机变量。 因此,要检索字符串变量,必须为其分配一个日期时间值。
数据类型为日期、时间、无时区时间戳或带时区时间戳的值,以对 SQL 用户透明的形式表示。 日期、时间和时间戳(带或不带时区)也可以用字符串表示。 这些表示直接与SQL用户相关,因为对于许多主机语言来说,没有特殊的SQL常量或主机变量具有日期、时间、无时区时间戳或带时区时间戳值的数据类型(对于Java变量)。 因此,要检索字符串变量,必须为其分配一个日期时间值。 结果字符串的格式取决于语句准备时生效的默认日期格式和默认时间格式。
每个日期时间值都分配有一个编码方案。 如果在安装面板DSNTIPF上,混合数据(MIXED DATA)字段设置为“是”(YES),则当日期时间值从其内部形式转换为混合CCSID形式的字符串表示时,将使用此编码方案。 否则将使用指定的编码方案的 SBCS CCSID。 对于Unicode,始终使用混合CCSID。 下表显示了编码方案的确定方式:
| 日期时间表达式 | 结果编码方案 |
|---|---|
| 列 | 与包含列的表格相同的编码方案 |
| 主变量 | 如果声明中提到:
|
| 专用寄存器 | 如果声明中提到:
|
| 表达式 | 如果声明中提到:
|
对于ASCII和EBCDIC,日期时间值的字符串表示必须是一个字符串。 对于Unicode,日期时间值的字符串表示可以是字符串,也可以是图形字符串。 因此,只有在编码方案为Unicode时,图形字符串才能用于日期时间值。
在Java以外的其他主机语言中,必须将日期时间值赋给字符串变量。 当为字符串变量指定日期或时间时,字符串格式由预编译选项或子系统参数决定。 当日期时间值的字符串表示形式用于其他操作时,它会被转换为日期时间值。 但是,只有当字符串表示形式被 Db2 识别或由安装提供的退出,并且另一个操作数是兼容的日期时间值时,才能做到这一点。 指定了本地化的日期或时间字符串输入表示的实际长度不能超过255字节。
字符串表示的日期时间值可能会出现在需要数据类型为日期、时间、无时区时间戳或带有时区时间戳的值的环境中。 日期、时间或时间戳(带或不带时区)的字符串表示形式可以作为参数传递给DATE、TIME、TIMESTAMP或TIMESTAMP_TZ函数,以获取日期时间值。 CAST 规范还可以将日期、时间或时间戳(带或不带时区)的字符表示转换为日期时间值。
- 日期字符串:
- 日期的字符串表示形式是以数字开头、长度至少为8个字符的字符串。 可以包含尾随零,不允许有前导零,月份和日期部分可以省略前导零。
下表显示了日期的有效字符串格式。 每种格式都有名称,并包含一个关联的缩写(供CHAR函数使用)和用法示例。 对于安装定义的日期字符串格式,在安装 Db2 时必须指定格式和长度。 此处无法一一列举。
表 2. 日期字符串表示的格式 格式名称 缩写 日期格式 示例 国际标准组织 ISO yyyy-mm-dd 1987年10月12日 IBM® 美国标准 USA mm/dd/yyyy 1987年12月10日 IBM 欧洲标准 EUR dd.mm.yyyy 12.10.1987 日本工业标准 公元纪年 JIS yyyy-mm-dd 1987年10月12日 安装定义 LOCAL 任何安装定义的形式 — - 时间字符串:
- 时间字符串表示法是以数字开头、长度至少为4个字符的字符串。 尾数可以包含,但不允许有前导零,时间小时部分可以省略前导零,秒数可以完全省略。 如果您选择省略秒数,则默认为0秒。 因此, 13.30 相当于 13.30.00。
下表显示了时间有效字符串格式。 每种格式都有名称,并包含一个关联的缩写(供CHAR函数使用)和用法示例。 如果是安装定义的时间字符串格式,则必须在安装 Db2 子系统时指定格式和长度。 此处无法一一列举。
表 3. 时间字符串表示的格式 格式名称 缩写 时间格式 示例 国际标准化组织 1 ISO1 hh.mm.ss 13.30.05 IBM 美国标准 USA 上午或下午 下午 1:30 IBM 欧洲标准 EUR hh.mm.ss 13.30.05 日本工业标准 公元纪年 JIS hh:mm:ss 13:30:05 安装定义 LOCAL 任何安装定义的形式 — 备注 :1. 这是ISO格式的早期版本。 JIS可用于获取当前的ISO格式。在美国的格式:
- 可以省略分钟,直接写00分钟。 例如,下午1点相当于下午1点。
- 字母A、M和P可以小写。
- 在上午或下午之前必须有一个空格。
- 时间不能大于12,也不能为0,除非是凌晨0点。
使用ISO格式的24小时制,美国格式与24小时制的对应关系如下:
- 凌晨12:01至凌晨12:59对应 00.01.00 , 00.59.00
- 上午01:00至上午11:59,请发送电子邮件至 01.00.00 , 11.59.00
- 中午12点至晚上11点59分,请发送邮件至 12.00.00 , 23.59.00
- 凌晨12点(午夜)对应于 24.00.00
- 凌晨0点(午夜)对应于 00.00.00
- 时间戳记字符串:
- 时间戳的字符串表示形式是以数字开头、长度至少为16个字符的字符串或图形串。
字符串或图形字符串必须包含符合 “日期时间常量” 中列出的格式之一的值,并遵守以下规则:
- 不允许使用空白页
- 可以包含尾随空格
- 时间戳的月份、日期、小时和时区小时元素可以省略前导零。 任何被省略的数字均默认为0。
- 如果分、秒和任何小数秒都为0,那么小时数可以是24。
- 时间戳的分钟、秒和时区分钟元素必须包含前导零。
- 小数秒的位数可以在0到12之间变化。 如果省略了小数秒,则默认规格为0。
- 如果秒数不包含小数部分,则可以省略秒数后面的分隔符。
- 在时间和时区之间可以包含一个可选的单空格。
- 可选时区可以采用以下格式之一:
- ±th:tm,取值范围为-24:00至+24:00。 -0 :00与+0:00的值相同。
- ±th,取值范围为-24到+24,时区分钟元素默认为00。
- 使用大写Z表示UTC
如果时间戳的字符串表示形式隐式转换为时间戳数据类型的值,则时间戳精度默认为6,而与字符串中小数秒位数无关。 在代表小数秒的第六位数字之后,数字被截断,缺失的数字被假定为零。 例如,
1990-3-2-8.30.00.10相当于1990-03-02-08.30.00.100000。 时间戳的字符串表示可以通过将值显式转换为具有指定精度的时间戳,或者对于常量,在字符串前添加TIMESTAMP关键字(例如,TIMESTAMP 2007-03-28-14.50.35.123;具有TIMESTAMP(3)数据类型),从而获得不同精度的时间戳。如果时间戳的字符串表示形式隐式转换为无时区时间戳值,则该字符串不得包含时区。
SQL语句还支持将 ODBC 或 JDBC 字符串表示的时间戳作为输入值。 时间戳的 ODBC 和 JDBC 字符串表示形式为 yyyy-mm-dd hh:mm:ss.nnnnnn。
LOCAL 日期和时间出口: 对于 LOCAL,ASCII 数据的日期出口为 DSNXVDTA,EBCDIC 的日期出口为 DSNXVDTX,Unicode 的日期出口为 DSNXVDTU。 对于LOCAL,ASCII数据的时间输出为DSNXVTMA,EBCDIC数据的时间输出为DSNXVTMX,Unicode数据的时间输出为DSNXVTMU。