2015-06-19 23 views
0

我在編寫一個查詢某些設備並將數據寫入PostgreSQL數據庫的腳本。PostgreSQL,Perl,DBD和帶有「TO_TIMESTAMP」的插入命令

該數據包括格式化爲31.12.2015 13:45:00的日期。數據庫使用DateType「German」,並且該列的類型是Timestamp,但不帶時區。

我總是收到此錯誤信息

DBD::Pg::st execute failed: ERROR: invalid input syntax for type timestamp: "TO_TIMESTAMP('19.06.2015 11:24:20','DD.MM.YYYY HH24:MI:SS')::timestamp without time zone" at temp_alcp2e_db.pl line 80, line 289.

我使用這個代碼,其中$date_db有日期值:

$date_db = 'TO_TIMESTAMP(\'' . $date_db . '\',\'DD.MM.YYYY HH24:MI:SS\')::timestamp without time zone'; 
$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; 

希望有人能告訴我我做錯了什麼。

+0

不能在事先準備好的聲明參數使用的功能。 – Jens

+0

http://snag.gy/drNx6.jpg pg'9.3.3' –

+0

PostgreSQL Docs說德語的格式是:「德語\t區域樣式\t 17.12.1997 07:37:16.00 PST」so've試圖將值編輯爲所需的格式,這也不起作用:「DBD :: Pg :: st執行失敗:錯誤:日期/時間字段值超出範圍:」19.06.2015 12:02:55.00 PST「 HINT :也許你需要一個不同的「日期樣式」設置。「,任何想法如何解決這個問題? – JanAx

回答

0

好吧,我發現我的問題/錯誤的來源:

要管理可視化我使用了「EMS SQL管理精簡版PostgreSQL的」數據庫,而這個漂亮的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'); 

,現在一切工作正常!

+0

如果日期格式確實是'ISO,MDY',那麼你的'strftime'格式是錯誤的。您應該使用@ user5018637提供的解決方案 – Borodin

+0

您可以使用ALTER DATABASE dbase SET datestyle TO「German,DMY」'來更改日期格式,我想象一下EMS管理器中必須有一個選項才能更改此設置 – Borodin

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;