将可变间隔添加到可变时间戳

时间:2014-05-26 11:29:56

标签: php postgresql

好的,首先我很少知道如何使用php,而且对sql的理解稍微好一些。所以,如果我做的任何事情看起来非常非常愚蠢,请耐心等待。

如果用户输入了日期,时间和时间间隔,我需要获得两个没有时区的时间戳 - 开始时间和结束时间。 e.g。

function myfunction($startdate, $starttime, $numhours){

$start = $startdate.' '.$starttime;
//I know this works for a timestamp because I have used this value in other sql statements and have been returned the correct results

$handler = $connection->prepare("SELECT TIMESTAMP :start + INTERVAL :numhours ' HOURS'");
$handler->bindParam(':start', $start);        
$handler->bindParam(':numhours', $numhours);
$handler->execute(); 
$end = $handler->fetchAll(); 

这只会给我带来以下错误:

Submitting booking.SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$1" LINE 1: SELECT TIMESTAMP $1 + INTERVAL $2 ' HOURS'

我还没有找到任何真正告诉我我在这里做错的事情(这可能很多)。感谢帮助。

编辑:我使用postgreSQL,通过`pgAdmin III

编辑:$ start应该有以下形式' YYYY-MM-DD HH:MM:SS'

1 个答案:

答案 0 :(得分:2)

问题是,你使用literal notation的值(参数)而不是常量。

字面符号只接受内容,例如:

SELECT TIMESTAMP '2014-05-25 14:29:59' + INTERVAL 3 HOUR;

它不能接受常量以外的值(表达式)(并且绑定参数不是常量。):

-- this will throw a syntax error
SELECT TIMESTAMP CONCAT('2014-05-25', ' ', '14:29:59');

您可以在此处使用CAST表单作为文字表示法:

$handler = $connection->prepare('SELECT CAST(:start AS TIMESTAMP) + ' .
                                'CAST(:numhours || \' hours\' AS INTERVAL)');
$handler->bindParam(':start', $start);        
$handler->bindParam(':numhours', $numhours);
$handler->execute(); 

编辑:或者,您可以使用PDO::ATTR_EMULATE_PREPARES在查询中使用真正的文字,但我相信postgres自己的准备功能是更好的选择。