2014-02-03 8 views
0

Я только что наткнулся на то, что, по моему мнению, должно быть ошибкой coldfusion.ColdFusion MYSQL Date Query Параметр, не возвращающий результаты

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

<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.

+0

Как указано ниже, cf_sql_datetime не является допустимым типом. Допустимые типы даты/времени: 'cf_sql_date' (только дата) и' cf_sql_timestamp' (дата и время). Однако правильное выражение зависит от того, какие значения вы сравниваете. Являются ли значения «callTime» только датами или содержат дату и время? Если они содержат только даты, то переход на 'cf_sql_date' будет делать трюк. В противном случае вам понадобится другое выражение. – Leigh

+0

@Leigh using cf_sql_timestamp не имеет значения. использование cf_sql_date не имеет значения. Как уже упоминалось в моем вопросе, выражение SQL прекрасно, оно работает, когда я передаю его в базу данных с параметрами запроса, которые отображаются в объекте запроса. Объекты даты также включают элементы времени. – Rumpleteaser

+0

@ Laura - Вы только дали нам часть картины. Нам нужно увидеть: a) фактические значения переменных: # startDate # и # endDate # b) выборка значений 'callTime' и c)« хорошие »результаты, когда вы *« переносите их в базу данных » – Leigh

ответ

4

Вместо этого используйте cfsqltype="cf_sql_date", так как «cf_sql_datetime» не является допустимым вариантом. См. help docs for cfqueryparam.

+1

cf_sql_datetime не задокументирован, но может работать - возможно, это зависит от конкретных драйверов JDBC или чего-то еще. –

+0

@PeterBoughton - Если это работает, это, вероятно, совпадение. Чтобы получить правильную функциональность даты, вам нужно использовать правильный тип: 'cf_sql_timestamp'. ACF просто игнорирует недопустимые типы, такие как 'cf_sql_datetime', и вместо этого использует' cf_sql_char', который, вероятно, передал бы строку, а не объект даты. – Leigh

+0

Я помню, что мне особенно нужно было использовать 'datetime' вместо' timestamp' - возможно, из-за того, что материал с датой/часовым поясом был ошибкой и позволял ему проходить через строку (который затем преобразовал сам БД), избегал неправильной обработки. –