如何使用PHP将UNIX时间戳插入oracle数据库

时间:2019-03-31 09:30:12

标签: php sql database oracle timestamp

我已经研究了堆栈溢出(有很多这样的问题,但PHP却没有)。

我有一张桌子,

CREATE TABLE test(
    my_id                   number(8)
                            NOT NULL
                            PRIMARY KEY,

    creation_date           timestamp
                            NOT NULL
);

我正在尝试将当前时间插入表格。我想使用一个值(而不是像CURRENT_TIMESTAMP这样的sql快捷方式来插入它。例如,在php中使用time()函数。

$customID = 1;
$currTime = time();

$sql = "INSERT INTO test (my_id, creation_date) 
        VALUES (:my_id, :creation_date)";
$stid = oci_parse($conn, $sql);
oci_bind_by_name($stid, ":my_id", $customID);
oci_bind_by_name($stid, ":creation_date", $currTime);
oci_execute($stid);

但是,当我运行上述语句时,出现了错误:

Warning: oci_execute(): ORA-00904: "CREATION_DATE": invalid identifier

3 个答案:

答案 0 :(得分:0)

UNIX时间戳采用纪元格式,即数字,但是您使用时间戳格式存储Unix时间。相反,将数据类型更改为整数可以解决该问题。

答案 1 :(得分:0)

您可以在下面使用这种转换

$sql = "INSERT INTO test (my_id, creation_date) 
        VALUES (:my_id, date'1970-01-01' + (:creation_date / 60 / 60 / 24 ) )";

此后,此计数开始于1970年1月1日UTC的Unix Epoch。其余时间显然与每一天的小时,分​​钟和秒的分数有关。

答案 2 :(得分:0)

Oracle中有一个鲜为人知的函数numtodsinterval(value,'intervalunit')可以使用。这样。

select to_date('19700101','YYYYMMDD') + numtodsinterval(1553990400,'SECOND') from dual;

或者在您的上下文中这样(未经测试)

$sql = "INSERT INTO test (my_id, creation_date) 
        VALUES (:my_id, to_date('19700101','YYYYMMDD') + numtodsinterval(:creation_date ,'SECOND'))";

Oracle doc