【发布时间】:2018-09-27 10:43:47
【问题描述】:
我正在尝试为给定月份/年份的每一天执行多行 INSERT。
如果循环只运行一次,一切都会按预期进行。如果它运行 2 次或更多次,则会引发以下错误:
SQLSTATE[22018]:强制转换规范的字符值无效:206 [Microsoft][ODBC SQL Server Driver][SQL Server]操作数类型冲突:文本与日期不兼容(SQLExecute[206] at ext\pdo_odbc\odbc_stmt. c:260)
如果我不准备日期,它也可以。我不知所措......我做错了什么吗?这是我的代码:
$query = "INSERT INTO scp.schedule
(record_create_date, associate_id, scheduled_date, shift_id, is_weekend)
VALUES ";
for ($day_count = 1; $day_count <= $days_month; $day_count++)
{
$day_count = sprintf("%02d", $day_count);
$full_date = $year . "-" . $month . "-" . $day_count;
// Check if date is weekend
$weekend = (date("N", strtotime($full_date)) < 6) ? 0 : 1;
$query .= "(GETDATE(), ?, ?, ?, ?), ";
$params[] = $associate["associate_id"];
$params[] = $full_date;
$params[] = $shifts[0]["shift_id"];
$params[] = $weekend;
}
// Remove the last comma and space
$query = substr($query, 0, -2);
$stmt = $db->prepare($query);
$stmt->execute($params);
我使用的是 SQL 服务器版本 12+ 和 PHP 版本 7+。 DB 中的列类型是 DATE。
编辑:
这行得通
INSERT INTO scp.schedule
(record_create_date, associate_id,
scheduled_date, shift_id, is_weekend)
VALUES (GETDATE(), ?, ?, ?, ?)
这不是
INSERT INTO scp.schedule
(record_create_date, associate_id,
scheduled_date, shift_id, is_weekend)
VALUES (GETDATE(), ?, ?, ?, ?),
(GETDATE(), ?, ?, ?, ?)
编辑 2:
一些测试和它们抛出的错误。我也尝试过使用'?'。
$query .= "(GETDATE(), ?, DATEFROMPARTS(?, ?, ?), ?, ?), ";
// Also tried intval() and casting to int
$params[] = $year;
$params[] = $month;
$params[] = $day_count;
SQLSTATE[22018]:强制转换规范的字符值无效:206 [Microsoft][ODBC SQL Server Driver][SQL Server]操作数类型冲突:文本与 int 不兼容(SQLExecute[206] at ext\pdo_odbc\odbc_stmt. c:260)
$query .= "(GETDATE(), ?, CONVERT(date, ?), ?, ?), ";
SQLSTATE[22018]:转换规范的字符值无效:529 [Microsoft][ODBC SQL Server Driver][SQL Server]不允许从数据类型文本到日期的显式转换。 (SQLExecute[529] at ext\pdo_odbc\odbc_stmt.c:260)
【问题讨论】:
-
对于我们这些懒得弄清楚查询是什么样子的人,您能否将
echo $query;的结果添加到您的问题中,以便我们可以看到您实际尝试运行的内容作为查询 -
$full_date看起来像什么?请记住DATE列不是DATETIME列。 -
@RiggsFolly 编辑了帖子
-
@delboy1978uk
$full_date看起来像“2018-10-01” -
您在
$params中没有足够的值来满足查询中的所有?
标签: php sql-server date pdo prepared-statement