@DATE
使用 @DATE 函数可根据传递到源列的格式将各种格式的日期和时间返回到目标列。@DATE 几乎会将任何类型的输入转换为有效的 SQL 日期。@DATE 还可以用于提取日期列的一部分或根据日期计算数字时间戳列。函数
语法
@DATE ('<output_descriptor>', '<input_descriptor>', <source_column>
[, '<input_descriptor>', <source_column>] [, ...])
<'output_descriptor'>
函数的输出。有效值为由目标列所需的日期描述符和可选文字值(如空格或冒号)组成的字符串。可以根据需要将日期描述符串联在一起。有关日期描述符的说明,请参见 Table 3-1 。格式描述符必须与目标的 date/time/timestamp 格式匹配。如果需要,Oracle GoldenGate 将覆盖指定的格式以使其正确。
<'input_descriptor'>
源输入。有效值是由日期描述符和可选文字值(例如空格或冒号)组成的字符串。可以根据需要将日期描述符串联在一起。下面是一些示例:
-
描述符字符串
'YYYYMMDD’表示使用<source_column>指定的源列包含(按顺序)四位数年份 (YYYY)、月份 (MM) 和日期 (DD)。 -
描述符字符串
'DD/MM/YY’表示使用<source_column>指定的源列包含日期、斜杠、月份、斜杠和两位数年份。
有关日期说明,请参见 Table 3-1 。
<source_column>
提供使用 <input_descriptor> 指定的输入的数字或字符源列的名称。
表 1 日期描述符
| 描述符 | 说明 | 对…有效 |
|---|---|---|
| CC | 世纪 | 输入/输出 |
| 是 | 两位数年份 | 输入/输出 |
| `YYYY` | 四位数字的年 | 输入/输出 |
| `MM` | 数字月份 | 输入/输出 |
| MMM | 字母数字月份,例如 APR、OCT |
输入/输出 |
| `DD` | 以数字形式显示月中的某日 | 输入/输出 |
| DDD | 一年中的数字日,例如 001 或 365 |
输入/输出 |
| DOW0 | 一周中的数字日(星期日 = 0) |
输入/输出 |
| DOW1 | 一周中的数字日(星期日 = 1) |
输入/输出 |
| DOWA | 一周中的字母数字日,例如 SUN、MON、TUE |
输入/输出 |
| HH | 小时 | 输入/输出 |
| MI | 分钟 | 输入/输出 |
| `SS` | 秒数 | 输入/输出 |
| 简体中文 | 用于已经是本地时间的 Julian 时间戳,或者在转换为 Julian 时间戳时保留本地时间。 | 输入/输出 |
| 简体中文 | Julian 时间戳,与 JTS. 相同 |
输入/输出 |
| `JTS` | Julian 时间戳。JUL 和 JTS 生成可在数字表达式中使用的数字。单位为微秒。在 Windows 计算机上,该值将用零 (0) 填充,因为 Windows 时间戳的粒度为毫秒。 |
输入/输出 |
| `JUL` | 朱利安日JUL 和 JTS 生成可在数字表达式中使用的数字。 |
输入/输出 |
| TTS | NonStop 48 位时间戳 | 输入 |
| `PHAMIS` | PHAMIS 应用程序日期格式 |
输入 |
| FFFFFF | 分数(最多微秒) | 输入/输出 |
| ` 状态 ` | STRATUS 应用程序时间戳 |
输入/输出 |
| 开始日期 | 自纪元以来的 C 时间戳(秒) | 输入/输出 |
ISO 8601 日期时间格式支持
Oracle GoldenGate 支持 ISO 8601,这是一种国际公认的表示日期、时间和时区的格式。以下是此 ISO 8601 格式的输入/输出描述符:
表 2 日期描述符
| 描述符 | 说明 | 对…有效 |
|---|---|---|
| ISO8601_DATETIME | 带有可选时区的 ISO 8601 日期时间格式。等效于 YYYY-MM-DDTHH:MI:SSTZ。 |
输入/输出 |
| ISO8601_DATETIME_FRACT | 带有可选小数秒和可选时区的 ISO 8601 日期时间格式。等效于 YYYY-MM-DDTHH:MI:SS.FFFFFFTZ。 |
输入/输出 |
| 时间 | 时区规范接受 +/-HH:MI 或区域 ID,例如 America/New_York。 |
输入/输出 |
示例
示例 1
在提供两位数年份但输出中需要四位数年份的实例中,存在多个用于获取正确世纪的选项。
- 可以对世纪进行硬编码,如下所示:
'CC', 19 or 'CC', 20
@IF函数可用于设置条件,如下所示:
'CC', @IF (YY > 70, 19, 20)
这样,当年份大于 70 时,世纪将设置为 19;否则,世纪将设置为 20。
- 系统可以自动计算世纪。如果年份小于 50,则系统将计算一个 20 世纪;否则将计算一个 19 世纪。
示例 2
以下语句将年份、月份和日期列转换为日期列。
date_col = @DATE ('YYYY-MM-DD', 'YY', date1_yy, 'MM', date1_mm, 'DD', date1_dd)
示例 3
以下语句将日期和时间转换为零,默认为秒。
date_col = @DATE ('YYYY-MM-DD HH:MI:00', 'YYMMDD', date1, 'HHMI', time1)
示例 4
以下语句将存储为 YYYYMMDDHHMISS 的数字列转换为 SQL 日期。
datetime_col = @DATE ('YYYY-MM-DD HH:MI:SS', 'YYYYMMDDHHMISS', numeric_date)
示例 5
以下语句将存储为 YYYYMMDDHHMISS 的数字列转换为 Julian 时间戳。
julian_ts_col = @DATE ('JTS', 'YYYYMMDDHHMISS', numeric_date)
示例 6
以下语句将 Julian 时间戳列转换为两个单独的列:YYYY-MM-DD HH:MI:SS 格式的日期时间列和包含时间戳微秒部分的分数列。
datetime_col = @DATE ('YYYY-MM-DD HH:MI:SS', 'JTS', jts_field), fraction_col = @DATE ('FFFFFF', 'JTS', jts_field)
示例 7
以下语句将存储为 YYYYMMDDHHMISS 的数字列转换为 ISO 8601 格式。
iso_datetime_col = @DATE ('YYYY-MM-DDTHH:MI:SSTZ', 'YYYYMMDDHHMISS', numeric_date)
示例 8
下面将全面计算时间。它从名为 dt 的源日期列转到名为 dt5 的目标列,该目标列将转换为日期 + 5 小时。计算还会从名为 ts 的源时间戳列转到名为 ts5 的目标列,该目标列将转换为时间戳 + 5 小时。
MAP scratch.t4, TARGET scratch.t4_copy,
COLMAP ( USEDEFAULTS,
dt5 = @DATE ('YYYY-MM-DD HH:MI:SS', 'JTS',
@COMPUTE (@DATE ('JTS', 'YYYY-MM-DD HH:MI:SS', dt) + 18000000000 ) ),
ts5 = @DATE ('YYYY-MM-DD HH:MI:SS.FFFFFF', 'JTS',
@COMPUTE ( @DATE ('JTS', 'YYYY-MM-DD HH:MI:SS.FFFFFF', ts) + 18000000000 ) )
) ;