Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在日期列中插入Oracle UTC日期字符串_Sql_Oracle_Perl_Oracle11g_Oracle10g - Fatal编程技术网

Sql 在日期列中插入Oracle UTC日期字符串

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'}))); 我已

我从我们的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'})));
我已经使用下面的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')