我收到了以下某个API的回复,
'createdate' => 'Sun Jan 31 04:40:15 UTC 2016'
我使用Oracle数据库来保存API数据,我使用Perl语言来解析API数据。在将上述日期字段插入db之前,我在我的Perl中执行了以下操作,将String转换为Date并且工作正常。
$res->{'createdate'} = strftime ('%d-%b-%y',localtime(str2time($res->{'createdate'})));
我尝试使用下面的插入查询(Oracle),所以我可以删除perl转换。最终会出现一些错误。请帮帮我。感谢。
例如:
insert
into device_det (id, createdate)
values (111111,TO_TIMESTAMP('Wed Aug 16 16:59:31 UTC 2017', 'YYYY-MM-DD'));
这会产生如下错误。
Error report -
SQL Error: ORA-01841: (full) year must be between -4713 and +9999, and not be 0
01841. 00000 - "(full) year must be between -4713 and +9999, and not be 0"
*Cause: Illegal year entered
*Action: Input year in the specified range
答案 0 :(得分:2)
您的尝试有两个问题。首先,从概念上讲,最重要的是,您的输入字符串表示时间戳WITH TIME ZONE,而不是通用时间戳。无论您如何将其添加到数据库,此数据所需的数据类型是什么?您需要将其转换为“本地”时区,然后简单地丢弃时区信息吗? (考虑TIMESTAMP WITH LOCAL TIME ZONE数据类型 - 如果您不熟悉,请进行Google搜索以查找文档。)在任何实际实施之前,您需要做出此决定 - 或者您的企业必须做出此决定。或者,您也可以将数据保存在TIMESTAMP WITH TIME ZONE数据类型中(以UTC作为时区)。
第二个,正如您在问题的评论中提到的那样,格式模型与输入字符串的实际结构不匹配。您的格式模型以'YYYY'
开头,因此输入字符串应该以年为先。但事实并非如此;它有'Wed '
。显然即使你解决了第一个问题,这也无法奏效。但回答第一个问题确实是重点;修复格式模型要容易得多。