Sql между запросом пытается получить столбец DATETIME, а не условие - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь отфильтровать между двумя DateTimes, допуская также нулевые значения

Я использую OdbcDataAdapter

objCon = new OdbcConnection(connStr05);
objDA = new OdbcDataAdapter(query, objCon);

Соединение работает нормально, потому что я использую его для других запросов select.

И я заполняю данные этой информацией

DataTable objDTfinal = new DataTable();
objDA.Fill(objDTfinal);

Я проверял различные запросы ...

Этот работает (не вылетает при запускезаполнение), но происходит сбой, показывая эту ошибку: параметры Year, Month и Day описывают непредставляемое исключение DateTime

"SELECT * FROM DBName.PUB.gvehicu 
where (( \"GVVE-fecmat\" BETWEEN '1753-01-01' 
AND '2500-12-31' or ( \"GVVE-fecmat\" IS NULL )) 
and (( \"GVVE-finiga\" BETWEEN '1753-01-01' 
AND '2500-12-31') OR ( \"GVVE-finiga\" IS NULL )))"

Тот же запрос без нулевого условия получает половину результатов, но он работает и заполняет всехорошо.

Мой босс сказал мне, что когда он работает с датами, он использует Convert (DATETIME, значение), поэтому я тоже попробовал этот способ, но этот запрос автоматически выдает ошибку, которая не может найти столбец DATETIME

"SELECT * FROM DBname.PUB.gvehicu 
where (( \"GVVE-fecmat\" BETWEEN CONVERT(DATETIME,'1753-01-01') 
AND CONVERT(DATETIME,'2500-12-31')) or ( \"GVVE-fecmat\" IS NULL )) 
and (( \"GVVE-finiga\" BETWEEN CONVERT(DATETIME,'1753-01-01') 
AND CONVERT(DATETIME,'2500-12-31')) OR ( \"GVVE-finiga\" IS NULL ))"
System.Data.Odbc.OdbcException: 'ERROR [42S22] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Column "DATETIME" cannot be found or is not specified for query. (13865)'

Я не уверен, должно ли это работать с конвертированием, и я делаю что-то не так, или есть другой способ получить это.

Я пытаюсь получить все автоматическиТаблицазначения с помощью одной операции для заполнения объекта DataTable, который я добавлю в другую таблицу с помощью SqlBulkCopy, поэтому я использую этот способ для работы.Исходная база данных - это Progress, к которому я получаю доступ через соединение odbc, а конечная база данных - SQL

.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Я наконец нашел решение. С базой данных прогресса вы должны передавать данные в другом формате. Передача datetime без преобразования и в этом формате работала для меня: 'YYYY-mm-dd', но если у вас есть год, месяц или день в переменной, вы должны передать как '@ YEAR @' + '-' + '@ МЕСЯЦ @ '+' - '+' 01 ' Поскольку информации очень много и она все еще дает сбой, потому что тайм-аут, я сделал разные диапазоны времени и даты, чтобы решить ее.

SELECT * FROM AUTO05AS.PUB.rhiscab where "RHMC-fecmov" < '1900-01-01'
SELECT * FROM AUTO05AS.PUB.rhiscab where "RHMC-fecmov" < '2000' + '-' + '01' + '-' + '01' AND "RHMC-fecmov" > '1900' + '-' + '01' + '-' + '01'
SELECT * FROM AUTO05AS.PUB.rhiscab where "RHMC-fecmov" < '2010' + '-' + '01' + '-' + '01' AND "RHMC-fecmov" > '2000' + '-' + '01' + '-' + '01' 
SELECT * FROM AUTO05AS.PUB.rhiscab where "RHMC-fecmov" < '2015' + '-' + '01' + '-' + '01' AND "RHMC-fecmov" > '2010' + '-' + '01' + '-' + '01' 
SELECT * FROM AUTO05AS.PUB.rhiscab where "RHMC-fecmov" < '2020' + '-' + '01' + '-' + '01' AND "RHMC-fecmov" > '2015' + '-' + '01' + '-' + '01' 
SELECT * FROM AUTO05AS.PUB.rhiscab where "RHMC-fecmov" > '2020-01-01'
0 голосов
/ 07 июня 2019

Из исключения видно, что построитель запросов ищет «DATETIME» в качестве столбца в таблице, что означает, что первым параметром должно быть значение. измените запрос, как показано ниже, и попробуйте.

"SELECT * FROM DBname.PUB.gvehicu 
where (( \"GVVE-fecmat\" BETWEEN CONVERT('1753-01-01', DATETIME) 
AND CONVERT('2500-12-31', DATETIME)) or ( \"GVVE-fecmat\" IS NULL )) 
and (( \"GVVE-finiga\" BETWEEN CONVERT('1753-01-01' , DATETIME) 
AND CONVERT('2500-12-31', DATETIME)) OR ( \"GVVE-finiga\" IS NULL ))"
...