DB2 将时间戳值和空值插入到可为空的时间戳列中

DB2 inserting both timestamp values and null values into a nullable timestamp column

当通过 PHP 脚本从源 table 选择时间戳(可以为空,默认为空)并尝试插入相同的目标 table 时, 我收到错误 'SYNTAX of date, time or timestamp value not valid SQL state 22008'。我相信这是因为某些源记录为空。当脚本运行时,我将大约一半的记录成功插入到我的目标 table 中,但只有那些具有实际时间戳值的记录。尚未插入空记录。

我的陈述:

    SELECT
        TIMESTAMP_EXPIRATION
    FROM TABLE1;

    INSERT INTO TABLE2 (EXPIRATION_T)
    VALUES ($TIMESTAMP_EXPIRATION);

问题是我的源记录有一半是空的,另一半是TIMESTAMP,度数为6

源和目标的定义 table 的列为 'TIMESTAMP_EXPIRATION FOR COLUMN 0011TTT TIMESTAMP DEFAULT NULL' 和 'EXPIRATION_T FOR COLUMN 00EETTT TIMESTAMP DEFAULT NULL'

我该怎么做才能同时插入空值?

更新:创建声明

 CREATE TABLE TABLE1 ( 
    ID INTEGER GENERATED ALWAYS AS IDENTITY ( 
    START WITH 1 INCREMENT BY 1 ),

    TIMESTAMP_EXPIRATION FOR COLUMN 0011TTT TIMESTAMP DEFAULT NULL )   

    RCDFMT TABLE1      ; 

CREATE TABLE TABLE2 ( 
    ID INTEGER GENERATED ALWAYS AS IDENTITY ( 
    START WITH 1 INCREMENT BY 1 ),

    EXPIRATION_T} FOR COLUMN 00EETTT TIMESTAMP DEFAULT NULL )   

    RCDFMT TABLE2      ; 

更新:PHP 脚本

    $getDev = "
    SELECT 
        ID,
        TIMESTAMP_EXPIRATION 
    FROM TABLE1
";

$stmt = odbc_exec($DB2connDEV, $getDev);

while($gettingItems = odbc_fetch_array($stmt)){

    $rows[] = $gettingItems;
}

foreach($rows as $row){

    $originalID = $row['ID'];
    $expiration = $row['TIMESTAMP_EXPIRATION'];


    $insertTable = "INSERT INTO table2 (id,expiration_t) VALUES (
        $originalID,
        '$expiration')";

    $stmt = odbc_exec($DB2connPROD, $insertTable);
}

考虑使用 prepared statement 而非字符串插值进行参数化,例如将 null 呈现为空字符串的 '$expiration'

$apn_stmt = odbc_prepare($DB2connPROD, "INSERT INTO table2 (id, expiration_t) VALUES (?, ?)");
$sel_stmt = odbc_exec($DB2connDEV, "SELECT ID, TIMESTAMP_EXPIRATION FROM TABLE1");

while($gettingItems = odbc_fetch_array($sel_stmt)) { 
    $rows[] = $gettingItems; 
} 

foreach($rows as $row) { 
    $originalID = $row['ID'];
    $expiration = ($row['TIMESTAMP_EXPIRATION'] == '' ? NULL : $row['TIMESTAMP_EXPIRATION']);
    $insertTable = odbc_execute($apn_stmt, array($originalID, $expiration));
}