【发布时间】:2025-12-05 07:45:02
【问题描述】:
tl;博士
为什么我无法转换以下字符串时间戳
select timestamp_format('2015-08-21 000000', 'YYYY-MM-DD HH24MISS') as timestamp
from sysibm.sysdummy1;
在 i7.1.0/OS 机器上?
特别是因为我可以转换
select timestamp_format('000000' , 'HH24MISS') as timestamp
from sysibm.sysdummy1;
到:
timestamp
-------------------------
2015-08-01 00:00:00.000000
上下文
在 i7.1.0/OS 机器上,我有一个表,其中时间戳数据分成几个十进制列,例如
declare global temporary table tstamp
(
year dec(4,0),
month dec(2,0),
day dec(2,0),
time dec(6,0)
);
像这样的数据
insert into session.tstamp
values (2015,8,21,92601),
(2015,8,21,132601);
我想对其进行一些日期过滤。鉴于格式有些不灵活,我认为将其转换为时间戳并使用它来查询表可能会更好。于是我咨询了i/OS 7.1 Manual on timestamp_format
我从构建日期部分开始,最后是
select
timestamp_format(YEAR || '-' || MONTH || '-' || DAY, 'YYYY-MM-DD') as timestamp
from session.tstamp;
返回
TIMESTAMP
--------------------------
2015-08-21 00:00:00.000000
2015-08-21 00:00:00.000000
完美,让我们添加时间部分和明确的lpad 它包含六个字符:
select
timestamp_format(YEAR || '-' || MONTH || '-' || DAY || ' ' || lpad(TIME, 6, '0'), 'YYYY-MM-DD HH24MISS') as timestamp
from session.tstamp;
这会导致以下错误:
SQL 状态:22007
供应商代码:-20448
消息:[SQ20448] 使用为 TIMESTAMP_FORMAT 指定的格式字符串的表达式无效。原因 。 . . . . : TIMESTAMP_FORMAT 函数的参数 1 无法使用参数 2 中指定的格式字符串进行解释,原因如下之一: -- 字符串表达式太短或太长。 -- 字符串表达式不符合格式字符串中指定的模板。 -- 在字符串表达式中为格式字符串中的相应格式元素指定了太多数字。 -- 字符串表达式中的值对于格式字符串中的相应格式元素无效。恢复 。 . . : 为函数指定一个有效的格式字符串。再次尝试请求。
根据manual关于format-string,字段之间的分隔符是可选的:
[...] 两个格式元素可以选择由以下一个或多个分隔符分隔: [...]
问题
既然我明确将时间长度限制为六个字符,为什么在使用 'YYYY-MM-DD HH24MISS' 作为 format-string 时我的值不被接受?
旁注
可以将HH24MISS 单独用作format-string,所以我无法完全理解这一点。
select timestamp_format(lpad(TIME, 6, '0'), 'HH24MISS') as timestamp from session.tstamp;
TIMESTAMP
--------------------------
2015-08-01 13:26:01.000000
2015-08-01 09:26:01.000000
【问题讨论】:
-
...最好将它存储为一个时间戳,尽管您现在可能无法更改它。不过,为您省去很多关于查询和无效值的麻烦(这里至少有一种潜在的解决方法可能不是 DST 安全的)。请注意,将
WHERE子句转换为时间戳将使查询不可搜索;它不能使用索引(几乎适用于所有功能)。如果省略更多分隔符会怎样? -
我完全同意你关于将它放在时间戳字段中的专业人士的架构问题。在这种情况下,查询将用于获取测试数据。所以速度不是最大的问题。省略所有分隔符按预期工作,但这迫使我离开填充所有字段。但是您肯定在这里做某事;如果我只有空格作为唯一的分隔符,我会得到同样的错误。
-
是的,我认为,与文档中暗示的相反,您要么需要分离所有内容,要么什么都不分离。
-
它在 i/OS 7.2 中按预期工作。