Параметр запроса даты Coldfusion MYSQL не возвращает результаты

Я только что наткнулся на то, что, как я думаю, должно быть ошибкой холодного синтеза.

У меня есть запрос:

<cfquery name="qryTest" datasource="#This.ds#">
SELECT *
FROM MyLovelyTable 
WHERE 1=1 
AND phoneNumber = <cfqueryparam cfsqltype="cf_sql_bigint" value="#variables.phoneNumber#"> 
AND callTime between <cfqueryparam cfsqltype="cf_sql_date" value="#variables.startDate#"> AND <cfqueryparam cfsqltype="cf_sql_date" value="#variables.endDate#"> 
ORDER BY phoneID
</cfquery>

Проблема в том, что если я прохожу через вторую переменную даты, ничего не возвращается. Если я скопирую префикс запроса SQL и параметры и запросю базу данных напрямую, результаты будут возвращены. Просто когда он проходит через CF, он не работает. Если я удалю второй параметр даты, он будет работать нормально. И если я преобразую второй параметр даты в строку, он будет работать.

Я попытался поменять значение второго параметра на now(), что тоже не работает.

Насколько я могу судить, проблема в том, что второй параметр даты является типом даты.

Я делаю что-то явно неправильное, о чем я не знаю?

Переменные startDate и endDate являются объектами dateTime для coldfusion. CallTime — это столбец dateTime в базе данных MariaDB.


person Rumpleteaser    schedule 03.02.2014    source источник
comment
Как указано ниже, cf_sql_datetime не является допустимым типом. Допустимые типы даты/времени: cf_sql_date (только дата) и cf_sql_timestamp (дата и время). Однако правильное выражение зависит от того, какие значения вы сравниваете. Являются ли значения callTime просто датами или они содержат дату и время? Если они содержат только даты, то переключение на cf_sql_date поможет. В противном случае вам понадобится другое выражение.   -  person Leigh    schedule 03.02.2014
comment
@Leigh, использующий cf_sql_timestamp, не имеет значения. использование cf_sql_date не имеет значения. Как упоминалось в моем вопросе, выражение SQL в порядке, оно работает, когда я передаю его в базу данных с параметрами запроса, которые отображаются в объекте запроса. Объекты даты также включают элементы времени.   -  person Rumpleteaser    schedule 04.02.2014
comment
@ Лаура - Вы дали нам только часть картины. Нам нужно увидеть а) фактические значения переменных: #startDate# и #endDate# б) образец значений callTime и в) хорошие результаты при переносе в базу данных   -  person Leigh    schedule 04.02.2014
comment
Кроме того, основываясь на имени столбца, мы все делаем предположение, что тип данных callTime — это дата и время. Это правильно?   -  person Leigh    schedule 04.02.2014
comment
@Leigh Да, callTime - это столбец dateTime. A) загружаются объекты даты и времени ColdFusion. б) пример значения callTime из базы данных: '2014-02-01 10:27:48' в) не понимаю, что вы здесь имеете в виду. Вы знакомы с ответами на запросы в CF? вы можете скопировать сгенерированный sql и заменить параметры предоставленными параметрами. Я сделал это. Результаты запроса не имеют значения. Проблемы не с оператором между или с фактическими датами, через которые я прохожу. это что-то фанковое с cfqueryparam   -  person Rumpleteaser    schedule 04.02.2014
comment
Идея a,b and c состоит в том, чтобы предоставить sscce, который мы можем запустить независимо и воспроизвести вашу проблему. Есть несколько возможных причин результатов, которые вы получаете от cfquery, но поскольку мы даже не знаем значений ваших параметров... мы можем только догадываться, что это может быть за причина. Есть смысл?   -  person Leigh    schedule 04.02.2014
comment
Проблема не в операторе between или в фактических датах, через которые я прохожу. это что-то странное с cfqueryparam Возможно. Но пока вы на самом деле не выясните настоящую причину/решение, ничего не исключайте. FWIW, ваш текущий запрос, похоже, отлично работает со встроенным драйвером MySQL. Но опять же, без фактического случая воспроизведения, я просто догадываюсь о фактических значениях... SQLFiddle * Тестовый пример   -  person Leigh    schedule 04.02.2014


Ответы (1)


Попробуйте вместо этого использовать cfsqltype="cf_sql_date", так как "cf_sql_datetime" не является допустимым параметром. См. справку по cfqueryparam.

person Carl Von Stetten    schedule 03.02.2014
comment
cf_sql_datetime не задокументирован, но может работать - вероятно, зависит от конкретных используемых драйверов JDBC или чего-то еще. - person Peter Boughton; 03.02.2014
comment
@PeterBoughton - Если это сработает, вероятно, это совпадение. Чтобы получить правильную функциональность даты, вам нужно использовать правильный тип: cf_sql_timestamp. ACF просто игнорирует недопустимые типы, такие как cf_sql_datetime, и вместо этого использует cf_sql_char, который, вероятно, будет передавать строку, а не объект даты. - person Leigh; 03.02.2014
comment
Я помню, что мне нужно было использовать datetime вместо timestamp - вполне возможно, что это было связано с тем, что материал даты / часового пояса был ошибочным, и позволяя ему проходить в виде строки (которую затем сама БД преобразовывала), избегала неправильной обработки. - person Peter Boughton; 03.02.2014
comment
Да, CF почти наверняка передавал значение в виде строки и позволял БД выполнять неявное преобразование. Я подозреваю, что вы могли бы использовать cf_sql_foo, и это тоже сработало бы ;-) - person Leigh; 03.02.2014
comment
(И просто чтобы уточнить, я не предлагаю, чтобы OP не нужно было использовать вместо этого date или timestamp, просто есть потенциальные причины, по которым может использоваться datetime.) - person Peter Boughton; 03.02.2014
comment
Нет, это определенно нарушило бы работу, потому что любое существование foo в моем коде автоматически вызовет исключение DullExampleVariableName. :П - person Peter Boughton; 03.02.2014
comment
Ха-ха. Хорошо, как насчет cf_sql_charcoalDateThymeInfusedBriquette? Иначе известный как более приземленный cf_sql_char ;-) - person Leigh; 03.02.2014
comment
@cfvonner cf_sql_datetime, безусловно, работает для дат. Поле не является полем метки времени, поэтому я использовал дату. Я обновил синтаксис в вопросе и проверил ваше предложение. Но это ничего не изменило. Единственное, что помогает, это передать второе значение в виде строки в правильном формате: S - person Rumpleteaser; 04.02.2014
comment
@LauraHansen - Нет, это не имеет ничего общего с датами. Типы cfsql основаны на jdbc java.sql. .Types и нет такого типа, как cf_sql_datetime. Тип jdbc для передачи даты и времени: TIMESTAMP. Когда CF видит cf_sql_datetime, он понятия не имеет, что это значит, и вместо того, чтобы выдать ошибку, он просто подставляет вместо нее cf_sql_char. - person Leigh; 04.02.2014
comment
(продолжение) Поэтому, когда вы его используете, вы, скорее всего, передаете string. Хотя ваша база данных может неявно преобразовывать эту строку в нужный тип, ... это не означает, что cf_sql_datetime на самом деле является допустимым типом cfsqltype. Тем не менее, каков фактический тип данных вашего столбца: date, datetime, ...? - person Leigh; 04.02.2014