日期时间值
日期时间数据类型为 DATE , TIME 和 TIMESTAMP。 虽然日期时间值可以在某些算术和字符串运算中使用,并且与某些字符串兼容,但它们不是字符串或数字。
日期
- 月份部分的范围为 1-12。
- 日部分的范围是 1- x,其中 x 是 28,29,30 或 31 ,并且取决于月份。
- 对于本地表,年份部分的范围为 0001-9999。
日期的内部表示是 4 字节的字符串。 每个字节由 2 个压缩十进制数字组成。 前 2 个字节表示年,第三个字节表示月,最后一个字节表示日。
如 SQLDA 中所述, DATE 列的长度为 10 字节,这是该值的字符串表示的相应长度。
时间
- 小时部分的范围为 0-24。
- 分钟和秒部分的范围是 0-59。
时间的内部表示是 3 字节的字符串。 每个字节由 2 个压缩十进制数字组成。 第一个字节表示小时,第二个字节表示分钟,最后一个字节表示秒。
TIME 列的长度 (如 SQLDA 中所述) 为 8 字节,这是值的字符串表示的相应长度。
时间戳记
时间戳记的内部表示是 7-13 字节的字符串。 每个字节由 2 个压缩十进制数字组成。 前 4 个字节表示日期,后 3 个字节表示时间,最后 0-6 个字节表示 秒的部分。
TIMESTAMP 列的长度 (如 SQLDA 中所述) 为 19-32 字节,这是该值的字符串表示的相应长度。
日期时间值的字符串表示
数据类型为 DATE , TIME 或 TIMESTAMP 的值以用户透明的内部格式表示。 但是,日期,时间和时间戳记值也可以由字符串表示。 这很有用,因为没有数据类型为 DATE , TIME 或 TIMESTAMP 的常量或变量。 必须先将日期时间值分配给字符串变量,然后才能进行检索。 CHAR 函数或 GRAPHIC 函数 (仅适用于 Unicode 数据库) 可用于将日期时间值更改为字符串表示。 字符串表示通常是与应用程序的地域代码相关联的日期时间值的缺省格式,除非在程序预编译或绑定到数据库时被 DATETIME 选项的规范覆盖。
无论其长度如何,大对象字符串都不能用作日期时间值的字符串表示 (SQLSTATE 42884)。
当在具有内部日期时间值的操作中使用日期时间值的有效字符串表示时,将在执行操作之前将字符串表示转换为日期,时间或时间戳记值的内部格式。
日期,时间和时间戳记字符串必须仅包含字符和数字。
日期字符串
| 格式名称 | 缩写 | 数据格式 | 示例 |
|---|---|---|---|
| 国际标准组织 (带分隔符) | ISO | yyyy-MM-dd | '2018-10-27' |
| IBM® USA 标准 | USA | yyyy/MM/dd | '10/27/2018' |
| IBM 欧洲标准 | EUR | dd.MM.yyyy | '27.10.2018' |
| 日本工业标准基督教时代 | JIS | yyyy-MM-dd | '2018-10-27' |
| 站点定义的 | LOC | 取决于应用程序的地域代码 | - |
- 可以包含尾部空格。
- 可以从月和日部分中省略前导零。
时间字符串
| 格式名称 | 缩写 | 时间格式 | 示例 |
|---|---|---|---|
| 国际标准组织 | ISO | hh.mm 或 hh.mm.ss | '13.30.05' |
| IBM USA 标准 | USA | hh 或 hh: mm AM 或 PM | "下午 1:30" |
| IBM 欧洲标准 | EUR | hh.mm 或 hh.mm.ss | '13.30.05' |
| 日本工业标准基督教时代 | JIS | hh: mm 或 hh:mm:ss | '13:30:05' |
| 站点定义的 | LOC | 取决于应用程序的地域代码 | - |
- 可以包含尾部空格。
- 可以从小时中省略前导零。
- 可以省略秒数,在这种情况下,将采用隐式指定值 0 秒 (例如, 13:30 等同于 13:30:00)。
- 国际标准组织改变了时间格式,使其与日本工业标准基督教时代格式相同。 因此,如果应用程序需要当前国际标准组织格式,请使用 JIS 格式。
- 美国格式:
- 可以省略分钟,在这种情况下,假定隐式指定为 00 分钟 (例如, 1 PM 相当于 1:00 PM)。
- 小时不得大于 12 ,并且不得为 0 ,但在特殊情况下 (00:00 AM) 除外。
- 在 "AM" 或 "PM" 之前存在单个空间。
- "AM" 或 "PM" 可以用小写或大写字符表示。
- 下表显示了美国格式与 JIS 格式的对应方式:
USA 格式 JIS 格式 上午 12:01 到中午 12:59 00:01:00 到 00:59:00 01:00 AM 到 11:59 AM 01:00:00 到 11:59:00 下午 12:00 (中午) 至晚上 11:59 12:00:00 到 23:59:00 上午 12:00 (午夜) 24:00:00 凌晨 00:00 (午夜) 00:00:00
时间戳记字符串
| 格式名称 | 时间戳记格式 | 示例 |
|---|---|---|
| 内部 (完整秒数) | yyyy-MM-dd-hh.mm.ss | '2018-03-22-12.00.00' |
| 内部 (小数秒) | yyyy-MM-dd-hh.mm.ss.SSSSSSSSSSSS | '2018-03-22-12.00.00.000000000005' |
| ODBC (完整秒数)1 | yyyy-mm-dd hh:mm:ss | '2018-03-22 08:30:58' |
| ODBC (小数秒)1 | yyyy-MM-dd hh:mm:ss.SSSSSSSSSSSS | '2018-03-22 08:30:58.000000000005' |
| 无定界符 | yyyyMMddhhmmss | '20180322120000' |
| 无定界符 (小数秒) | yyyyMMddhhmmssSSSSSSSSSSSSSS | '20180322120000123456123456' |
| 1 此格式只能用于输入值,不能用于输出值或常量。 时间戳记的日期和时间部分在此处显示为用空格分隔。 它们也可以用连字符或字母 T 分隔。 例如, "2018-03-22 08:30:58.7" , "2018-03-22-08:30:58.7" 和 "2018-03-22T08:30:58.7" 都是等效的。 | ||
- IBM SQL 是唯一受支持的输出格式
- 可以将秒数指定为最多 12 个小数位。
- 尾部零可以被截断或从小数秒中完全省略。
- 可以从时间戳记的月,日和小时部分中省略前导零。
- 字符串可以包含任意数目的尾部空格。
- 如果将时间戳记的字符串表示隐式强制转换为具有 TIMESTAMP 数据类型的值,那么强制转换结果的精度由表达式中 TIMESTAMP 操作数的精度或赋值中 TIMESTAMP 目标的精度确定:
- 超出强制类型转换精度的小数秒的数字将从字符串中截断。 例如,如果将字符串 "2018-3-2-8.30.00297" 强制转换为 TIMESTAMP (3) ,那么结果为 2018-03-02-08.30.00.002。
- 如果强制类型转换的精度超过字符串的精度,那么将使用零填充结果。 例如,如果将字符串 "2018-3-2-8.30.07" 强制类型转换为 TIMESTAMP (12) ,那么结果为 2018-03-02-08.30.00.070000000000。
- 通过显式地将时间戳记的值强制转换为具有指定精度的时间戳记,可以为时间戳记的字符串表示提供不同的时间戳记精度。 如果字符串是常量,那么替代方法是在字符串常量前面加上 TIMESTAMP 关键字。 例如, TIMESTAMP '2018-03-28 14:50:35.123' 具有 TIMESTAMP (3) 数据类型。