2016-08-16 12 views
1

特定のユーザのレコードの完全なセットから特定の年と月に該当するレコードを取得しようとしています。まず、itemdateのフィールドはMySqlタイプの日時です(例:2016-08-15 20:00:25)。ユーザーのための記録の4行がありますクエリ内のColdfusion MySQLクエリ

2016-08-15 20:00:25 
2015-06-01 20:25:05 
2016-08-15 20:26:00 
2016-08-15 23:30:35 

特定のユーザーのためにこれらのレコードはによって取得されています

<cfset thisyear = #Year(Now())#> 
<cfset thismonth = #Month(Now())#> 

:現在の年と月がによって決定され

<cfquery datasource="userdatbase"name="reportlist"> 
select itemid, itemdate, itemvalue 
from itemlib 
where userid = '#currentuserid#' 
</cfquery> 

今すぐ元のクエリをフィルタリングし、現在の年と月のクエリのみを取得します。

<cfquery dbtype="query" name="detail"> 
     select itemid, itemdate, itemvalue 
     from reportlist 
     where year(itemdate) = #thisyear# 
     and month(itemdate) = #thismonth# 
    </cfquery> 

次のエラーが発生します:

エラーデータベースクエリの実行中です。

クエリクエリの構文エラー。 「年が発生しました の1予想される不正な条件式、[のような|ヌル|中| |との比較]条件、

私が代わりにこれを行うことを試みています。

を取り払うます
<cfquery dbtype="query" name="detail"> 
     select itemid, itemdate, itemvalue 
     from reportlist 
     where #year(reportlist.itemdate)# = #thisyear# 
     and #month(reportlist.itemdate)# = #thismonth# 
    </cfquery> 

しかし、私はの詳細クエリの4つのレコードをすべて取得しました。私は2015-06-01 20:25:05レコードを選択するとは思っていません。私はこれに頭を悩ましています。何か助けていただければ幸いです。ありがとうございます。

+0

はわから月/年機能は、使用している接続/ドライバの種類かかわらず、あなたはサポートされていますか?月/年がMySQLでサポートされているように見えるので、エンジンがクエリの解析に問題があるとは思われません。https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions .html#function_month – xQbert

+0

*しかし、私はすべての4行を持っている*あなたはそれがだと思う何をSQLクエリが行っていないので...'WHERE 1 = 1'のような2つのリテラル値の比較をしています。クエリのすべての行に対して常に真(または偽)です。 – Leigh

+0

元のデータベースクエリに日付範囲を設定すると、ページはどうなりますか? –

答えて

5

coldfusionクエリのクエリ(QofQ)には、dbmsのすべての機能がありません。 year()はQofQ構文ではサポートされていません。それは(あなたがreportlistをループされていないと仮定して)クエリreportlist最初の行におけるitemdateの値となるreportlist.itemdateの値を渡しているので

あなたの2番目のクエリは、構文的に正しいです。 ColdFusionでは、これをクエリの行の値を比較するのではなく、2つのリテラルの値を比較するものとして解釈します。

また、アイテムの日付が>= fromDateから< fromDateからプラス1ヶ月です、あなたのクエリをフィルタ処理、その後、あなたがしたい月の最初の日に、変数(fromDate)を設定することができます。以下を参照してください。

<!--- set fromDate to the first date of the month ---> 
<cfset fromDate = createDate(thisyear, thismonth, 1) /> 
<cfquery dbtype="query" name="detail"> 
    select itemid, itemdate, itemvalue 
    from reportlist 
    where itemdate >= <cfqueryparam value="#fromDate#" cfsqltype="cf_sql_date" /> 
      and itemdate < <cfqueryparam value="#dateAdd('m', 1, fromDate)#" cfsqltype="cf_sql_date" /> 
</cfquery> 

これは、ColdFusion QoQでサポートされているコンパレータを使用して同じことを実現します。

ここにいくつかの有用なドキュメント:http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec0e4fd-7ff0.html

+0

ありがとうございました@beloitdavisja YEARとMONTHがQofQで動作しないことはわかりませんでしたが、MySQLにもこれらの機能があると思いました。私の最初のQofQ試行でMySQLの機能がうまくいかなかったのはなぜですか?また、CFが個々の行の値に対して機能しないこともわかりませんでした。私はそれが16行(4x4)を返しませんループがあれば?これはQofQを初めて使用したときのことです。 – Jack

+1

@Jack MySQLにはこれらの機能があります。しかし、クエリクエリ*はMySQLでは実行されません。 QofQは、メモリ内のデータベースクエリの結果セットをフィルタリングまたは変更するために最もよく使用されます。これは強力なツールですが、独自のルールと制限された構文があるため、苛立つ可能性があります。 MySQLのようなフル機能のデータベースクエリ言語ではなく、結果セットがMySQLデータベースに由来する場合でも、これらのデータベースクエリ言語の機能は使用しません。 – beloitdavisja

+1

*ユーザーのために何かがあるかどうかを確認する必要があります*また、複数のクエリ(またはQoQ)を一切必要としない場合もあります。 itemlibとreportlistにJOINを使用できず、それをuserIDでフィルタリングできない理由はありますか? – Leigh

関連する問題