Неполучение желаемого результата после выполнения QoQ

Я выполняю следующие SQL-запросы и не получаю желаемого результата:

 <cfquery datasource = "XX.XX.X.XX" name="master">
    SELECT count(Timedetail) as Occurances, date_format(Timedetail,'%m-%d-%Y') 
    FROM   MyDatabase
    WHERE  EVENTS = "FIRST" GROUP BY Timedetail ;
 </cfquery> 
<cfquery dbtype="query" name="detail">
    SELECT  *
    FROM    master 
    WHERE  Timedetail >= <cfqueryparam value="#form.startdate#" cfsqltype="cf_sql_date"> 
    AND    Timedetail <  <cfqueryparam value="#dateAdd('d', 1,form.enddate)#" cfsqltype="cf_sql_date">;
</cfquery> 

Соответствующие столбцы базы данных:

  • TimeDetail: Содержит все значения, связанные с датой и временем.
  • Events: содержит такие значения, как ПЕРВЫЙ, ВТОРОЙ, ТРЕТИЙ и т. д. Я упомянул ПЕРВЫЙ здесь для удобства и ясности.

Что касается параметров startdate и enddate, я установил их следующим образом:

 <cfparam name="form.startdate" default="#dateformat(now()-5, 'mm/dd/yyyy')#">
 <cfparam name="form.enddate" default="#dateformat(now()-1, 'mm/dd/yyyy')#">
 <cfparam name="form.selectdate" default="#dateformat(now(), 'mm/dd/yyyy')#">

Итак, мой основной запрос отображает следующие результаты:

  OCCURANCES  TIMEDETAIL
1   15712   06-06-2013
2   7533    06-07-2013
3   20899   06-10-2013
4   24075   06-11-2013
5   24219   06-12-2013
6   21485   06-13-2013
7   22661   06-14-2013
8   20010   06-15-2013
9   18032   06-16-2013
10  27588   06-17-2013
11  25861   06-18-2013
12  21106   06-19-2013
13  22281   06-20-2013
14  21736   06-21-2013
15  20060   06-22-2013
16  18384   06-23-2013
17  24233   06-24-2013
18  39901   06-25-2013
19  31132   06-26-2013
20  41744   06-27-2013
21  38926   06-28-2013
22  34910   06-29-2013
23  25682   06-30-2013
24  48400   07-01-2013
25  42847   07-02-2013
26  30014   07-03-2013
27  21047   07-04-2013
28  29982   07-05-2013
29  25056   07-06-2013
30  13733   07-07-2013
31  35753   07-08-2013
32  20966   07-09-2013
33  41713   07-10-2013
34  30976   07-11-2013 

И мне интересно, почему мой «подробный» запрос ничего не отображает, хотя я указал параметр startdate как 2013-06-12 и параметр enddate как 2013-07-12, который виден в наборе результатов, как указано ниже. Он должен отображать события и время для указанного диапазона дат.

RESULTSET   
query
    OCCURANCES  TIMEDETAIL
CACHED  false
EXECUTIONTIME   0
SQL     SELECT * FROM master WHERE Timedetail >= ? AND Timedetail <?;
SQLPARAMETERS   
array
1   {ts '2013-06-12 00:00:00'}
2   {ts '2013-07-12 00:00:00'}  

person Tan    schedule 16.07.2013    source источник


Ответы (2)


Запросы в памяти (QoQ) могут быть сложными, когда речь идет о типах данных. Они гораздо менее осведомлены о неявных преобразованиях типов данных, чем базы данных. Используя функцию MySQL date_format, вы фактически конвертируете значения даты и времени в строки. Таким образом, когда вы запускаете свой QoQ, CF может на самом деле выполнять сравнение строки, которое даст очень разные результаты, чем сравнение даты. Может объяснить, почему вы получаете неправильные результаты.

Попробуйте изменить запрос базы данных, чтобы он возвращал значение даты и времени вместо строки:

SELECT 
   COUNT(Timedetail) as Occurances
   , STR_TO_DATE( DATE_FORMAT(Timedetail,'%m-%d-%Y'), '%m-%d-%Y') AS Timedetail
FROM   ....
WHERE  ...

Обновление:

Другой вариант — преобразовать значение в виде DATE в QoQ. Это заставит QoQ выполнять сравнение дат вместо сравнения строк:

WHERE  CAST(Timedetail AS DATE) >= <cfqueryparam value="#form.startdate#" 
                                          cfsqltype="cf_sql_date"> 
person Leigh    schedule 16.07.2013
comment
Спасибо за ваш комментарий. Я понял. Пожалуйста, прочитайте мой комментарий выше :) - person Tan; 16.07.2013
comment
Спасибо, что упомянули о функции STR_TO_DATE. :) - person Tan; 17.07.2013

Ну я сам разобрался. Функция MySQL date_format() возвращает строку, а не объект даты и времени, поэтому при выполнении моего запроса запроса в ColdFusion я использовал тип данных CF_SQL_VARCHAR вместо CF_SQL_DATE, и все работало нормально.


(обновление из комментариев)

Ответ выше оказался неверным. Когда я использовал CF_SQL_VARCHAR, я получал неожиданные результаты, фактически неполные результаты. Когда я применил функцию STR_TO_DATE, она работала нормально.

person Tan    schedule 16.07.2013
comment
@Leigh Большое спасибо за вашу постоянную помощь. Ценится. - person Tan; 16.07.2013
comment
Ой, я только что понял, что неправильно прочитал ваш ответ. Если это вообще возможно, лучше оставить значение столбца как datetime и выполнить сравнение date. Попробуйте обходной путь, о котором я упоминал. Сравнение строк намного более привередливо. Даже дополнительный пробел может привести к тому, что запрос вернет нулевые записи. - person Leigh; 16.07.2013
comment
@Leigh Вы абсолютно правы, я получал неожиданные результаты, на самом деле неполные результаты. Когда я применил функцию STR_TO_DATE, она работала нормально. Спасибо еще раз !! :) - person Tan; 17.07.2013
comment
Кстати, учитывая, что вышеизложенное не работает, его не следует помечать как ответ. - person Leigh; 24.07.2013
comment
Лол, ты забыл свои комментарии сверху? Tan - @Leigh Вы абсолютно правы, я получил неожиданные результаты, на самом деле неполные результаты. Когда я применил функцию STR_TO_DATE, она работала нормально. Спасибо еще раз !! :) - person Leigh; 02.08.2013
comment
Лол, но в итоге я использовал функцию DATE() вместо STR_TO_DATE :) - person Tan; 02.08.2013
comment
Это было позже и совсем в другой ветке. Как незнакомец, просматривающий эту ветку год, мог узнать об этом? Я думаю, вы упускаете из виду цель сайта вопросов и ответов сообщества ;-) Думайте о каждом вопросе как о коротком рассказе. Через год незнакомец сталкивается с той же проблемой. Они читают ваш вопрос и помеченный ответ, думая, что это решит их проблему. К сожалению, поскольку вы никогда не обновляли свой ответ, чтобы указать, что то, что вы опубликовали, на самом деле не работает, они использовали бы неправильный код... - person Leigh; 02.08.2013
comment
.. и потратил больше времени, пытаясь понять, почему это не сработало так, как вы сказали. Помните, что этот сайт является ресурсом и для других, а не только для вас. Поэтому, прежде чем помечать что-то как отвеченное и двигаться дальше, убедитесь, что оно содержит точную информацию! В этом и заключается цель функции редактирования — улучшать ответы по мере того, как вы будете узнавать больше информации. В противном случае вы можете вызвать у кого-то те же головные боли, что и у вас. - person Leigh; 02.08.2013
comment
Хм, понял. Я удалю это как ответ. - person Tan; 02.08.2013