Невозможно вставить дату с подготовленным заявлением - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь сделать многострочную INSERT для каждого дня данного месяца / года.

Если цикл выполняется только один раз, все работает, как и ожидалось.Если он запускается 2 или более раз, он выдает следующую ошибку:

SQLSTATE [22018]: недопустимое значение символа для спецификации приведения: 206 [Microsoft] [драйвер ODBC SQL Server] [операнд SQL Server]Тип clash: текст несовместим с датой (SQLExecute [206] в 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 Server версии 12+ и PHP версии 7+.Тип столбца в БД - ДАТА.

РЕДАКТИРОВАТЬ:

Это работает

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] [SQL Server] Тип операндаclash: текст несовместим с int (SQLExecute [206] в ext \ pdo_odbc \ odbc_stmt.c: 260)

$query .= "(GETDATE(), ?, CONVERT(date, ?), ?, ?), ";

SQLSTATE [22018]: недопустимое значение символа для спецификации приведения:529 [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Явное преобразование текста типа данных в дату недопустимо.(SQLExecute [529] в ext \ pdo_odbc \ odbc_stmt.c: 260)

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вы можете попытаться избежать передачи строк в качестве значений для поля даты в SQL Server, используя DATEFROMPARTS () или CONVERT () Функции T-SQL.

<?
$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       = $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;

    # Using DATETIMEFROMPARTS
    $query .= "(GETDATE(), ?, DATEFROMPARTS(?, ?, ?), ?, ?), ";
    $params[] = $associate["associate_id"];
    $params[] = $year;
    $params[] = $month;
    $params[] = $day;
    $params[] = $shifts[0]["shift_id"];
    $params[] = $weekend;

    # Using CONVERT
    /*
    $query .= "(GETDATE(), ?, CONVERT(date, ?), ?, ?), ";
    $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);

?>

Если нет необходимости вставлять все дни в один оператор, вы можете подготовить свой оператор один раз и выполнять его на каждой итерации.Затем, если произойдет ошибка, вы узнаете, какие значения вызывают проблему.

0 голосов
/ 27 сентября 2018

Попробуйте использовать trim вместо substr.

$query = trim(trim($query), ',');

Внутренний trim удалит space, а внешний trim удалит ,

...