Я не могу понять, что я делаю неправильно здесь. У меня есть следующие значения для этих переменных.Почему я получаю «Ошибка конверсии при преобразовании даты и/или времени из символьной строки» при вычитании числа из GETDATE()?
my $sql = qq~
SELECT COUNT(*)
FROM tableName u
WHERE 1=1 AND u.ManufacturerPartNumber IN ('X','Y','Z')
AND CAST(u.InspectionStartDate AS DATETIME) > (GETDATE() - ?)
~;
my $argsRef->{lookBack} = 30;
И когда я пытаюсь запустить selectrow_array
на SQL, как например:
my $qnCount = $dbh->selectrow_array($sql, undef, $argsRef->{lookBack});
Я получаю следующее сообщение об ошибке:
DBD::ODBC::db selectrow_array failed: [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting date and/or time from character string. (SQL-22007) [for Statement "
SELECT COUNT(*)
FROM tableName u
WHERE 1=1 AND u.ManufacturerPartNumber IN ('X','Y','Z')
AND CAST(u.InspectionStartDate AS DATETIME) > (GETDATE() - ?)
"]
Итак, это мое понимание того, что третья параметр в вызове selectrow_array из дескриптора базы данных должен быть переменными связывания. Тем не менее, они, похоже, не является обязательным ....
ручка базы данных создаются как таковые:
my $dbh = DBI->connect_cached("dbi:ODBC:$dsn", undef, undef, {
PrintError => 0,
RaiseError => 1,
ShowErrorStatement => 1,
LongReadLen => 500000,
})
$dsn
является правильным DSN, но не показан, по разным причинам, но мы знаем, что это работает граждение сообщение об ошибке, возвращаемое с SQL Server.
Любая идея, что я делаю неправильно?
Заранее за вашу помощь.
Я предполагаю, что запрос должен быть '(GETDATE() - 30)'; заполнители цитируются по умолчанию, так что вы фактически получаете '(GETDATE() - '30')'. Посмотрите раздел «Типы данных для заполнителей» в [DBI docs] (https://metacpan.org/pod/DBI#bind_param) и [DBD :: ODBC docs] (https://metacpan.org/pod/DBD :: ODBC# Binding-Columns). – ThisSuitIsBlackNot
Ну, начните с [используя 'DATEADD()' вместо сокращенного] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with -date-время operations.aspx). Также часть о $ dsn и подключении к базе данных была скопирована из другого вопроса и здесь не уместна. –
Это не похоже на проблему с Perl или DBI, скорее ваш запрос на дату выглядит неправильно. Рассмотрите возможность использования 'dateadd' для вычитания дней из' getdate' http://stackoverflow.com/questions/27247770/how-to-subtract-30-days-from-the-current-date-using-sql-server –