繁体   English   中英

使用 PHP 和 PDO 与 MS SQL 从字符串转换日期时间时转换失败

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

这是我在这个网站上的第一篇文章,所以如果格式有些奇怪,我提前道歉:)

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

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

为了解决这个问题,在尝试了很多不同的方法来让 NULL 值起作用之后,我写了一个 function 将所有 null 值替换为零。 除了日期值外,这工作正常 - 在将它们注释掉后,插入语句可以正常工作 - 但是有了它们,我得到“从字符串转换日期时间时转换失败”。 错误,大概是因为数据库无法将“0”转换为日期时间值。

我将如何解决此问题 go?

这是我的 function 替换了 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`

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM