dateFormat ('date', 'yyymmdd');использование 3y это правильно? - PullRequest
1 голос
/ 26 октября 2011

У меня есть простая страница поиска, которая ищет Контракт-сайт-инспекции из базы данных Sybase. Имеет 3 переменные поля формы: -

<form name="inspections" action="" method ="post">
  <!---a list of Sites where the Inspections occured --->
    <select name="selectSitesList" id="selectSitesList" multiple >                                                             
     <option value=""></option>
    </select>
   <input name="startDate" id="startDate" value="">  
   <input name="endDate" id="endDate" value="">     
    </form>

Когда в поле поиска задано значение startDate, по запросу не выбираются никакие результаты (например, -01/01/2001). Но если в поле поиска не указано значение startDate (т. Е. StartDate имеет значение NULL или пусто), все возможные результаты отображаются. Запрос Sybase Select выглядит следующим образом: -

 SELECT   ins.Inspection_ID
                , ins.SiteLoc_ID
    , sl.SiteLoc_Name
    , ins.Inspected_By
    , ins.Inspection_Reason
    , ins.Inspection_Comments
    , ins.Inspection_Date 
        From INSPECTIONS ins
                        , SITELOCATION sl
        Where ins.SiteLoc_ID = sl.SiteLoc_ID 
        <cfif IsDefined ("form.selectSitesList") AND rtrim(ltrim(form.selectSitesList)) NEQ "">
            And ins.SiteLoc_ID in (#listqualify(form.selectSitesList,"'")#)
        </cfif>
        <cfif (IsDefined ("form.startDate") AND rtrim(ltrim(form.startDate)) NEQ "") and (IsDefined ("form.endDate") AND rtrim(ltrim(form.endDate)) NEQ "") >
            And CONVERT(VARCHAR(8), ins.Inspection_Date, 112) Between '#DateFormat(form.startDate, 'yyymmdd')#' and '#DateFormat(form.endDate, 'yyymmdd')#'
        <cfelseif IsDefined ("form.startDate") AND rtrim(ltrim(form.startDate)) NEQ "">
            And CONVERT(VARCHAR(8), ins.Inspection_Date, 112) = '#DateFormat(form.startDate, 'yyymmdd')#'
        </cfif>
        Order By sl.SiteLoc_Name
                              , ins.Inspection_Date

Мне было интересно, если #DateFormat (form.startDate, 'yymmdd') # {2 y's} правильно вместо #DateFormat (form.startDate, 'yyymmdd') # {3 y's} Использование CF-8. Пожалуйста, помогите.

Ответы [ 3 ]

3 голосов
/ 26 октября 2011

Является ли значение, которое CONVERT (VARCHAR (8), ins.Inspection_Date, 112) создает чем-то, что может быть разумно сопоставлено со значением, которое #DateFormat (form.startDate, 'yyymmdd') # '? «yyy» кажется странной маской года (по сравнению с более распространенной «yyyy» или «yy», я имею в виду).

Мне кажется странным, что вы конвертируете столбцы даты в БД в строки и конвертируете поля формы в строку для их сравнения, а не конвертируете поля формы в даты и сравниваете их таким образом.

Кроме того, какой бы ни была базовая ситуация, вы должны использовать CFQUERYPARAM для параметризации ваших динамических значений, а не жестко программировать вашу строку SQL.

1 голос
/ 26 октября 2011

Если вы должны использовать строки, то форматы должны совпадать, как сказал Адам.Однако я бы также предложил использовать объекты datetime.При использовании функции convert этот способ может помешать базе данных правильно использовать индексы.(Не говоря уже о том, что всегда есть вероятность непредвиденных результатов при использовании неявного преобразования. Хотя для формата yyyymmdd это меньше, чем для

. Обычно я использую приведенный ниже запрос для сравнения диапазонов дат.Он извлекает все записи в определенном диапазоне date , не заботясь о временной части.Обратите внимание, что типы sql для Sybase могут немного отличаться.

<cfset form.startDate = "01/01/2001">
<cfset form.endDate   = "01/31/2001">
...
<!--- cf_sql_date ensures any time portion is truncated --->
AND ins.Inspection_Date >= <cfqueryparam value="#form.startDate#" cfsqltype="cf_sql_date">
AND ins.Inspection_Date < <cfqueryparam value="#dateAdd('d', 1, form.endDate)#" cfsqltype="cf_sql_date">

.. Результат эквивалентен вашему BETWEEN утверждению, т.е. найти все записи от в период с 1 по 31 января 2001 года

...
AND ins.Inspection_Date >= January 1, 2001 12:00 AM
AND ins.Inspection_Date < February 1, 2001 12:00 AM 
1 голос
/ 26 октября 2011

Вы пробовали #DateFormat (form.startDate, 'yyyymmdd') #?

...