如何修复SQL查询中的“从字符串转换日期时转换失败”错误?

时间:2015-09-09 17:24:29

标签: sql sql-server laravel-4 sql-server-2012

我在日志中找到的错误是下面的错误。

  

'Illuminate \ Database \ QueryException',消息为'SQLSTATE [22007]:   [Microsoft] [SQL Server的ODBC驱动程序11] [SQL Server]转换   从字符串转换日期和/或时间时失败。 (SQL:

SELECT COUNT(*) AS aggregate 
FROM [mytable] 
WHERE [mytable].[deleted_at] IS NULL 
    AND [created_at] BETWEEN '2015-09-30T00:00:00' AND '2015-09-30T23:59:59' 
    AND ((SELECT COUNT(*) FROM [mytable_translation] 
         WHERE [mytable_translation].[item_id] = [mytable].[id]) >= 1)
  

)”   在   wwwroot的\ MyProject的\厂商\ laravel \框架\ SRC \照亮\数据库\ Connection.php:625

在数据库中,DataType为datetime不为空

基于marc_s's answer我试图更改我发送到数据库的格式。所以我在T上没有and [created_at] between '2015-09-30 00:00:00' and '2015-09-30 23:59:59'的情况下尝试过。

在我的本地,我正在使用mysql,代码工作得很好。如果我在SQL Server客户端上测试上面的查询,两者(有和没有T)也可以工作。

如何在不对数据库本身进行任何更改的情况下解决此问题?

PHP / Laravel代码:

$items = $items->whereBetween($key, ["'".$value_aux."T00:00:00'", "'".$value_aux."T23:59:59'"]);

1 个答案:

答案 0 :(得分:1)

在@ lad2025的帮助下,我得到了它的工作。

基于他对我的问题的评论,我改变了代码部分(在这种情况下是Laravel / PHP)我传递的格式。 (实际上,我“删除”了它自己的格式,只是在传递给查询之前将字段添加到变量中。这样,我让数据库决定他想要的格式)

而不是

$itens = $itens->whereBetween($key, ["'".$value_aux."T00:00:00'", "'".$value_aux."T23:59:59'"]);

我将代码更改为:

$sta = $value_aux."T00:00:00";
$end = $value_aux."T23:59:59";
$itens = $itens->whereBetween($key, [$sta, $end]);