我已经研究了堆栈溢出(有很多这样的问题,但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
答案 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'))";