2015-12-31 3 views
0

ColdFusion 9 с использованием хранилищ баз данных Access даты, такие как 1/12/2015, 2/22/2015, 1/21/2015 и т.д ...ColdFusion CFQuery Ищу Месяц Только

Ищу только получить результаты за месяц, такие как январь только февраль только и т.д ...

можно легко вытащить год только если мне это нужно с помощью:

 <cfquery name="f" datasource="ds"> 
     select * from master 
     where eventdate like '%#yr#%' 
     </cfquery> 

Где год, как 2015 - я могу легко получить год.

Но когда я переключаюсь на:

 where eventdate like '%1/%' 

Я получаю Синтаксис FROM ошибки - я не могу получить только январь. Наверное, простое решение, но я его не хватает.

Thx для любой помощи.

+0

Каков тип даты eventdate? –

+0

Январь или февраль ЛЮБОГО года или только в течение определенного года? – Leigh

+0

My Bad ... Над кодом работает - как и WHERE MONTH (eventDate) = 1 - Я полностью пропустил предложение where в своем коде - но поставил его здесь ... –

ответ

0

Вы можете использовать метод Format, доступный в Access.

Попробуйте это: Format([eventdate],"yyyy/mm/dd") или если вы просто хотите, месяц и не заботятся о годе, ваш запрос может выглядеть следующим образом:

select * from master 
where Format([eventdate],"mm") = 1 
+0

Не используйте Format() для сопоставления даты. Format() возвращает строку и сравнение строк значений даты, как известно, неоднозначно и проблематично. Если вы абсолютно должны использовать функции, придерживайтесь функций даты, таких как 'month()', 'day()' и т. Д. – Leigh

+0

Да, я согласен с Ли. Использование функций даты - waaaay лучше. Сравнение строк с датами не всегда корректно. –

1

Вы экранировать специальные символы доступа с помощью скобок следующим образом:

WHERE evendate LIKE '%1[/]%' 

Кроме того, если поле является актуальной DATE (не звучит, как это) вы можете дразнить его с месяцем(), как в:

WHERE MONTH(eventDate) = 1 

Вы также можете иметь возможность конвертировать/отбрасывать ваше поле символов в данных, используя ASDATE так:

WHERE MONTH(asDate(eventdate)) = 1 

Там это предел моего древнего опыта доступа. удачи. :)

+2

Важно, чтобы OP также учитывала их неправильное представление: только потому, что значение даты, отображаемое определенным образом в клиентском приложении, не означает, что он хранится внутри. Он будет храниться как некоторое числовое значение внутри, но, как вы намекаете на Mark - насколько касается Access, это, вероятно, дата *, если он должен быть запрошен * в качестве даты *, поэтому используется функция даты, а не Строковые функции для извлечения частей его значения. –

2

Используйте настоящие даты, в нормальном формате.

yyyy-mm-dd - в значительной степени единственный нормальный формат даты, тогда как mm/dd/yyyy - это почти самое сумасшедшее представление даты. Не используйте это представление для каких-либо целей, кроме конечного пользователя.

<cfset date = Now()> <!--- or some other actual date --> 
<cfset dtfrom = DateFormat(date, "yyyy-mm-01")> 
<cfset dtuntil = DateFormat(DateAdd("m", 1, dtfrom), "yyyy-mm-01")> 

<cfquery name="f" datasource="ds"> 
    select * from master 
    where eventdate >= '#dtfrom#' and eventdate < '#dtuntil#' 
</cfquery> 

Преимущество использования этой формы является то, что >= ... and < ...если у вас есть индекс по eventdate, он может быть использован для этого. Почти каждый другой вариант выражения одного и того же условия (например, Month(eventDate) = ...) не может использовать индекс.

+3

Согласовано. Как правило, подход '> =' и '<' лучше всего подходит для сопоставлений дат, хотя предпочтительно использовать объекты даты и '' вместо строк (даже Access поддерживает его). Однако одним исключением является то, что вам нужно получить все записи за определенный месяц или день - за * любой * год. В этом случае конструкция '> =' и '<' не поможет. Вы должны прибегать к использованию функций базы данных, таких как 'MONTH()' или 'DAY()', что, как отметил Томалак, помешает базе данных использовать любые индексы в этом столбце, делая ее менее эффективной. Поэтому избегайте их, если это вообще возможно. – Leigh

Смежные вопросы