【问题标题】:Conversion failed when converting datetime from character string using PHP and PDO with MS SQL使用 PHP 和 PDO 和 MS SQL 从字符串转换日期时间时转换失败
【发布时间】:2012-04-04 22:16:52
【问题描述】:

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

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

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

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

}

【问题讨论】:

  • 明确一点:如果日期是NULL,应该在目标表中插入什么?复制时是否需要将NULL 替换为空字符串或0,或者您是否也可以在目标表中包含NULL-values?

标签: php sql-server pdo prepared-statement


【解决方案1】:

欢迎来到 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 中选择所有dates 并将它们插入到destination 中,为每个新创建的元组创建一个新ID。这也将保留 NULL 值。

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

【讨论】:

  • IFNULL 是 MySQL 似乎确实存在将 Null 发送到除用于 MSSQL 的 PDO 中的字符串以外的任何内容的问题 - 如果其他人已解决,请告诉我们。
  • @RichardTurner MSSQL 中的等效函数称为ISNULL(expression, replacement)。我还没有在 MSSQL 服务器上使用过 PDO,所以我无法对此发表评论。
  • 似乎是 MSSQL PDO 问题。它与'null'''和null混淆了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多