【发布时间】:2026-01-13 19:20:02
【问题描述】:
我正在运行一项服务,该服务(应该)返回一个带有来自 sql 查询的响应的 json 以填充表。出于调试目的,我已将生成的查询字符串添加到响应中以直接在数据库上尝试,并且查询在我的数据库中工作。 实际上,当我从我的服务运行它时,我遇到了以下错误,我需要解决这个问题:
日期中的年份无效。当我选择“和 table.datefield >= '".$date."'
日期中的月份无效。当使用“和 table.datefield >= {d'".$date."'}
两者都带有 HY000 错误代码。 (以下说明)
SQLSTATE[HY000]:一般错误:-1204 [Informix][Informix ODBC 驱动程序][Informix]日期中的无效年份 (SQLPrepare[-1204] at /usr/PRODUCTO/apache_jano/PDO_INFORMIX-1.3.3/informix_driver.c:131) ISAM:264
SQLSTATE[HY000]:一般错误:-1205 [Informix][Informix ODBC 驱动程序][Informix]日期中的月份无效 (SQLPrepare[-1205] at /usr/PRODUCTO/apache_jano/PDO_INFORMIX-1.3.3/informix_driver.c:131) ISAM:264
在某些时候,上面的第二个选项起作用了(它检测到年份,所以我认为它是最接近的方法),但它不再起作用了。我也找不到找到 {d} 文档的地方(过去解决了它),任何链接也将不胜感激。 还有一件事我不能为此使用 bind_params(我被明确告知不要这样做)。
这是失败的部分(在我的查询中删除这个条件很完美)
在 dbeaver 中工作并取自响应字符串的 SQL 代码条件:
AND (
(table.fecha_inicial <= { d '2018-07-15' }AND (table.fecha_final >= { d '2019-07-15' }OR table.fecha_final IS NULL))
OR
(table.fecha_inicial >= { d '2018-07-15' }AND (table.fecha_final <= { d '2019-07-15' } OR table.fecha_final IS NULL)))
PHP 编码
if ($fechaInicio){ $fechaInicio = date('Y-m-d', strtotime($fechaInicio));}
if ($fechaFin){ $fechaFin = date('Y-m-d', strtotime($fechaFin));}
$cond_fechas = " AND ( (table.fecha_inicial <= '".$fechaInicio."' AND (table.fecha_final >= {d'".$fechaFin."'} OR table.fecha_final IS NULL)) "
. " OR (table.fecha_inicial >= '".$fechaInicio."' AND (table.fecha_final <= {d'".$fechaFin."'} OR table.fecha_final IS NULL)))";
$result['query'] = $query;
$conn = DB::getConnection('bbdd');
$result['das']= $conn->preparedQuery($query);
if (isset($result['das'])) {
return JwtCheckHeader::json($result['das']);
} else {
return JwtCheckHeader::json($result);
}
【问题讨论】:
-
{ d }符号来自Escape Sequences in ODBC,这似乎也适用于 jdbc(这就是它们在dbeaver中工作的原因)。您需要了解您的服务环境使用的日期格式是什么。 -
格式应该是 YYYY-mm-dd (2019-01-16) 或者我在 php 中用日期格式化它 ('Y-m-d' )。我在数据库上以这种方式直观地看到它。会不会和我看到的不一样?它似乎丢失了格式或无法正确使用,但不知道为什么。随意将您的评论作为答案,因为它为我提供了一个提示,让我可以跟进 {d} 评论的研究。我真的很感激。