Sql 在日期列中插入Oracle UTC日期字符串
我从我们的API中得到了如下响应Sql 在日期列中插入Oracle UTC日期字符串,sql,oracle,perl,oracle11g,oracle10g,Sql,Oracle,Perl,Oracle11g,Oracle10g,我从我们的API中得到了如下响应 'createdate' => 'Sun Jan 31 04:40:15 UTC 2016' 我使用Oracle数据库保存API数据,并使用Perl语言解析API数据。在将上面的日期字段插入db之前,我在Perl中执行了以下操作,将字符串转换为日期,并且工作正常 $res->{'createdate'} = strftime ('%d-%b-%y',localtime(str2time($res->{'createdate'}))); 我已
'createdate' => 'Sun Jan 31 04:40:15 UTC 2016'
我使用Oracle数据库保存API数据,并使用Perl语言解析API数据。在将上面的日期字段插入db之前,我在Perl中执行了以下操作,将字符串转换为日期,并且工作正常
$res->{'createdate'} = strftime ('%d-%b-%y',localtime(str2time($res->{'createdate'})));
我已经使用下面的insertquery(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
你的尝试有两个问题。首先,也是概念上最重要的一点,您的输入字符串表示带时区的时间戳,而不是一般的时间戳。无论您打算如何将其添加到数据库中,此数据所需的数据类型是什么?您是否需要将其转换为“本地”时区,然后简单地放弃时区信息?(但也要考虑带有本地时区数据类型的时间戳——如果您不熟悉文档,请使用谷歌搜索查找文档。)在任何实际实施之前,您需要做出此决定——或者您的企业必须做出此决定。或者,您也可以使用时区数据类型(UTC为时区)将数据保留在时间戳中
第二,正如在对您的问题的评论中已经提到的,格式模型与输入字符串的实际结构不匹配。您的格式模型以
'YYYY'
开头,因此输入字符串应该是第一年。但事实并非如此;它有“Wed”
。显然,即使你解决了第一个问题,这也行不通。但回答第一个问题才是关键;修复格式模型要容易得多。您的尝试有两个问题。首先,也是概念上最重要的一点,您的输入字符串表示带时区的时间戳,而不是一般的时间戳。无论您打算如何将其添加到数据库中,此数据所需的数据类型是什么?您是否需要将其转换为“本地”时区,然后简单地放弃时区信息?(但也要考虑带有本地时区数据类型的时间戳——如果您不熟悉文档,请使用谷歌搜索查找文档。)在任何实际实施之前,您需要做出此决定——或者您的企业必须做出此决定。或者,您也可以使用时区数据类型(UTC为时区)将数据保留在时间戳中
第二,正如在对您的问题的评论中已经提到的,格式模型与输入字符串的实际结构不匹配。您的格式模型以
'YYYY'
开头,因此输入字符串应该是第一年。但事实并非如此;它有“Wed”
。显然,即使你解决了第一个问题,这也行不通。但回答第一个问题才是关键;修复格式模型要容易得多。时间戳的第二个参数不应该是匹配该数据字符串的模式吗?您的目标是YYYY-MM-DD,对吗?根据需要,目标始终为时间戳类型
。但是我从来没有使用过Oracle,我所做的就是阅读文档。尝试一下TO_TIMESTAMP_TZ(“Wed Aug 16:59:31 UTC 2017”,“Dy Mon DD HH24:MI:SS TZR YYYY”)
TO_TIMESTAMP的第二个参数不应该是匹配该数据字符串的模式吗?您的目标是YYYY-MM-DD,对吗?根据需要,目标始终为时间戳类型
。但是我从来没有使用过Oracle,我所做的就是阅读文档。请尝试使用时间戳('Wed Aug 16:59:31 UTC 2017','Dy Mon DD HH24:MI:SS TZR YYYY')