Учитывая дату "13.03.2010", используя это в предложении MYSQL Where? - PullRequest
3 голосов
/ 14 марта 2010

Я бы хотел передать запрос MYSQL через Coldfusion на следующую дату: 13.03.2010 Таким образом, запрос фильтрует против него так:

SELECT *
FROM myTable
WHERE dateAdded before or on 03/13/2010

Я также хотел бы иметь возможность принимать 2 даты в диапазоне от: 01/11/2000 до: 03/13/2010

SELECT *
FROMT myTable
WHERE dateAdded is ON or Between 01/11/2000 through 03/13/2010

Кроме того, есть ли способ иметь один запрос, который может обрабатывать ОБА Date_Start и Date_END, или только один из двух?

спасибо

Ответы [ 5 ]

4 голосов
/ 14 марта 2010

Если вы не можете отформатировать дату в YYYY-MM-DD в Coldfusion, вы можете использовать функцию STR_TO_DATE в MySQL следующим образом:

SELECT 
    *
FROM 
    myTable 
WHERE 
    dateAdded <= STR_TO_DATE('03/13/2010','%m/%d/%Y');

И ...

SELECT 
    *
FROM 
    myTable 
WHERE 
    dateAdded BETWEEN STR_TO_DATE('01/11/2000','%m/%d/%Y') AND 
                      STR_TO_DATE('03/13/2010','%m/%d/%Y');
2 голосов
/ 14 марта 2010

Лучший способ сделать это в Coldfusion - использовать cfqueryparam для управления преобразованием строки в объект даты, а также для обеспечения уровня предотвращения внедрения SQL.

<cfset myResult = queryNew("id")>
<cfset startDate = "01/11/2000">
<cfset endDate = dateFormat(now(), "mm/dd/yyyy")>

<cfquery name="myResult" datasource="myDatasource">
    SELECT *
    FROM myTable 
    WHERE dateAdded BETWEEN <cfqueryparam CFSQLType="CF_SQL_DATE" value="#startDate#">
    AND <cfqueryparam CFSQLType="CF_SQL_DATE" value="#endDate#">
</cfquery>

<cfoutput query="myResult">
 ...output code here
</cfoutput>
1 голос
/ 14 марта 2010
SELECT *
FROM myTable 
WHERE dateAdded <= YourdateValue

или

SELECT *
FROM myTable 
WHERE dateAdded BETWEEN YourdateValueStart AND YourdateValueEnd

Посмотрите на STR_TO_DATE (str, format)

Это обратная Функция DATE_FORMAT (). Требуется строка str и формат строки формата. STR_TO_DATE () возвращает значение DATETIME если строка формата содержит оба части даты и времени, или ДАТА или ВРЕМЯ значение, если строка содержит только дату или части времени. Если дата, время или Значение datetime, извлеченное из str, является незаконно, STR_TO_DATE () возвращает NULL и выдает предупреждение. Сервер сканирует str, пытаясь соответствовать формату к этому. Строка формата может содержать буквенные символы и формат спецификаторы, начинающиеся с%. буквальный символы в формате должны совпадать буквально на ул. Спецификаторы формата в формат должен соответствовать дате или времени на ул. Для спецификаторов, которые могут быть используется в формате, см. DATE_FORMAT () описание функции.

SELECT * 
FROM myTable  
WHERE (dateAdded <= YourdateValueStart AND YourdateValueEnd  IS NULL)
OR  (dateAdded >= YourdateValueEnd AND YourdateValueStart  IS NULL)
OR (dateAdded BETWEEN YourdateValueStart AND YourdateValueEnd)
0 голосов
/ 15 марта 2010

Вы можете использовать cfqueryparam с типом cfsql CF_SQL_TIMESTAMP. С учетом переменных «startDate» и «endDate» приведенный ниже код должен работать. Если для startDate или endDate установлено значение, подобное false, оно не будет включено:

<cfset startDate = createDate(2010, 01, 19) />
<cfset endDate  = createDate(2010, 01, 26) />

<cfquery name="q" datasource="#request.dsn#">
    SELECT *
    FROM myTable
    WHERE 
    (
        <cfif isDate(startDate)>
            dateAdded >= <cfqueryparam value="#dateFormat(startDate, "YYYY/MM/DD")#" cfsqltype="CF_SQL_TIMESTAMP" />
        </cfif>
        <cfif isDate(endDate)>
            <cfif isDate(startDate)>AND</cfif>
            dateAdded <= <cfqueryparam value="#dateFormat(endDate, "YYYY/MM/DD")#" cfsqltype="CF_SQL_TIMESTAMP" />
        </cfif>
    )
</cfquery>

Попробуйте выполнить то же самое, но с параметром startDate или endDate, установленным в false, как показано ниже, чтобы увидеть, как все это работает в одном запросе:

<cfset startDate = false />
<cfquery name="q" datasource="#request.dsn#">....
0 голосов
/ 14 марта 2010

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

так что я думаю, что вы можете

SELECT *
FROM myTable
WHERE dateAdded  <= 20100111

and

SELECT *
FROMT myTable
WHERE dateAdded is  BETWEEN 20000111 AND 20100303

В общем, вот список функций манипулирования датами, которые предлагает mySQL: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.htm

...