PostgreSQL,Perl,DBD和带有“TO_TIMESTAMP”的Insert命令

时间:2015-06-19 09:43:34

标签: perl postgresql date insert timestamp

我正在编写一个脚本来查询某些设备并将数据写入PostgreSQL数据库。

数据包含格式为<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.carousel.js"></script> <div class="row"> <h4 style="text-align: center;">Cadeaux À Votre Portée</h4> <div class="customNavigation"> <img src="http://placehold.it/500" style="margin-right: 20px;" /><a class="btn prev">&lt;</a> <a class="btn next">&gt;</a> <img src="http://placehold.it/500" style="margin-left: 20px;" /> </div> </div> <div class="row"> <div id="owl-demo" class="owl-carousel owl-theme"> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">1700 PTs</div> </p:panel> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">1250 PTs</div> </p:panel> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">900 PTs</div> </p:panel> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">1300 PTs</div> </p:panel> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">3000 PTs</div> </p:panel> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">1500 PTs</div> </p:panel> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">900 PTs</div> </p:panel> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">1300 PTs</div> </p:panel> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">1300 PTs</div> </p:panel> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">1300 PTs</div> </p:panel> <p:panel styleClass="item"> <div class="row"> <p:graphicImage styleClass="img" library="espace" name="http://placehold.it/500" /> </div> <div class="row">Lorem Ipsum</div> <div class="row"> <p:commandButton icon="fa fa-shopping-cart" /> </div> <div class="row">1300 PTs</div> </p:panel> </div> </div>的日期。数据库使用DateType“German”,该列的类型为Timestamp,没有时区。

我总是收到此错误消息

  

DBD :: Pg :: st执行失败:错误:类型为timestamp的输入语法无效:   “TO_TIMESTAMP('19 .06.2015 11:24:20','DD.MM.YYYY HH24:MI:SS')::没有时区的时间戳”   在temp_alcp2e_db.pl第80行,第289行。

我正在使用此代码,其中31.12.2015 13:45:00具有日期值:

$date_db

希望有人可以告诉我我做错了什么。

2 个答案:

答案 0 :(得分:1)

该函数可以(并且必须)成为预准备语句的一部分。

重写您的代码,如下所示:

$stmt =$dbh->prepare(q{
INSERT INTO rifutemp ("USER_LINK_ID","IP","DATUM","TEMPERATURE")        
        VALUES (?, ?, 
        TO_TIMESTAMP(?, 'DD.MM.YYYY HH24:MI:SS')::timestamp without time zone,
        ?)
});

$stmt->execute($key_bgtr,$key_ip,$date_db,$temperatur) or die $DBI::errstr;

答案 1 :(得分:0)

好的,我发现了我的问题/错误来源:

为了直观地管理数据库,我正在使用“用于PostgreSQL的EMS SQL Manager Lite”,这个漂亮的GUI工具总是将DateStyle选项设置为“ISO,MDY”。

我刚刚改变了我的代码:

$dbh->do("SET datestyle = 'German'");
$stmt =$dbh->prepare("INSERT INTO rifutemp (\"USER_LINK_ID\",\"IP\",\"DATUM\",\"TEMPERATURE\") 
                            VALUES (?, ?, ?, ?)");
$stmt->execute($key_bgtr,$key_ip,$date_db,$temperatur) or die $DBI::errstr;

并将$ date_db变量设置为正确的格式:

$date_db = Time::Piece->new->strftime('%d.%m.%Y %H:%M:%S');

现在一切正常!