使用PHP和带有MS SQL的PDO从字符串转换日期时间时,转换失败


Conversion failed when converting datetime from character string using PHP and PDO with MS SQL

这是我在这个网站上的第一篇文章,所以如果格式中出现一些奇怪的东西,我很抱歉:)

在互联网上搜索了大约一周这个问题的答案后,我想我应该试试这个网站,因为它在过去无数次帮助过我。

无论如何,我最近开始在PHP中使用PDO与我一直在做的一个项目中的MSSQL数据库进行交互。其中一个表的设置方式基本上是所有的数字、日期时间和字符字段。我的问题是日期字段。我正在编写的脚本是从一个表中复制一行,并用它自己的ID将其放入另一个表——我遇到了错误,因为原始表中的数据变化很大,并且许多字段的默认值为NULL。

为了解决这个问题,在尝试了很多不同的方法来使NULL值发挥作用之后,我编写了一个函数,用零替换所有NULL值。除了日期值之外,这一切都很好-在注释掉它们之后,insert语句会正常工作-但是,在使用它们时,我会收到"从字符串转换日期时间时转换失败。"错误,可能是因为数据库无法将"0"转换为日期时间值。

我该怎么解决这个问题?

这是我的函数,用于替换NULL值。我觉得我还应该注意,如果我只是保持值为NULL,我会在将数据类型nvarchar转换为数字时出错。错误

function check_empty($field, $slno){
try{
    require("assets/dbcnct.php");
    $stmt = $DBH->prepare(" select ". $field ." from timeticket where slno = :slno ");  
    $stmt->bindParam(':slno', $slno);
    $stmt ->execute();  
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    echo "<pre>";
    var_dump($result);
    echo "</pre>";
    foreach($result as $key=>$val){
            if(empty($val)){
                    $val = 0;
            }   
    }   
    return trim($val);
}
catch(PDOException $e) {  
    echo "<pre>";
    echo $e->getMessage();  
    echo "</pre>";
}       

}

欢迎使用Stackoverflow!:-)

设置NULL值的默认值

你可以做

SELECT IFNULL(`myColumn`, 'default value for this column') as `myColumn` ...

设置列的默认值(如果是NULL)。如果不是NULL,这将返回myColumn的值,否则返回default value for this column的值。

示例:如果表中的日期为NULL ,则获取当前日期

SELECT IFNULL(`myDateColumn`, NOW()) as `myDateColumn` ... 

在MySQL中的表之间复制元组

我还认为,您不需要PHP将元组从一个表复制到另一个表中。请参阅MySQL的INSERT INTO SELECT。

示例:假设您有sourcedestination,它们都有一个自动递增的主键id和一个允许NULL值的列date

INSERT INTO `destination` (`id`, `date`) SELECT NULL, `date` FROM `source`

这将从表source中选择所有date,并将它们插入到destination中,为每个新创建的元组创建一个新的ID。这也将保留NULL值。

这是在表之间复制元组的首选解决方案。因为MySQL和PHP之间实际上没有数据传输,所以这将非常快,即使对于大量的元组也是如此。