1

クエリのクエリから AllPosts というクエリがあります。

AllPosts には 2 つの結果があります。

Row 1| ID: 2   PublishedDate: 2012-05-30 16:47:00.0
Row 2| ID: 3   PublishedDate: 2012-05-31 15:50:00.0

を使用して FilterPosts という AllPosts でクエリのクエリを実行すると、

WHERE PublishedDate BETWEEN '2012-05-01 00:00:00' AND '2012-05-31 23:59:00'

(実際のクエリは、これらの値に対して cfqueryparam cf_sql_date を実行していることに注意してください)

FilterPosts には AllPosts と同じ行が含まれているはずですが、代わりに ID 2 しか取得できません。ID 2 の公開日を に変更すると2012-05-30 23:59:50.0、FilterPosts は正しい結果を返します。

私も試してみました

WHERE PublishedDate >= '2012-05-01 00:00:00'   
AND   PublishedDate <= '2012-05-31 23:59:00'   

5月31日には特に奇妙なことがあります。

ここで髪を伸ばします!ありがとう!

元のクエリをスクラッチで作成してみましたが、奇妙なことに、同じ結果が得られました。

<cfset test = queryNew("Name,PublishedDate", "VarChar, Time" )>
<cfset queryAddRow(test)>    
<cfset querySetCell(test,"PublishedDate","2012-05-30 16:47:00.0")>     
<cfset querySetCell(test,"Name","First Entry")>    
<cfset queryAddRow(test)>    
<cfset querySetCell(test,"PublishedDate","2012-05-31 15:47:00.0")>    
<cfset querySetCell(test,"Name","Second Entry")>    

<cfset StartDate = CreateDate(2012, 5, 1)>

<cfquery name="filter" dbtype="query">    
    SELECT Name, PublishedDate    
    FROM    test
WHERE    1=1
AND PublishedDate >= <cfqueryparam value="#StartDate#" cfsqltype="cf_sql_date">
AND PublishedDate <= <cfqueryparam value="#DateAdd( 'n', -1, DateAdd('m', 1, StartDate) )#" cfsqltype="cf_sql_date">
 </cfquery>

Filter の結果には、本来あるべき両方ではなく、'FirstEntry' のみが含まれます。

4

3 に答える 3

3

奇妙なことに、それはcfqueryparamと関係がありました。私はCreateDate()を使用して、次のような開始日/終了日を作成していました。

<cfset StartDate = CreateDate(2012,5, 1)>

私は次のようなクエリのクエリでSQLWHEREでそれを使用していました:

WHERE PublishedDate >=  <cfqueryparam value="#StartDate#" cfsqltype="cf_sql_date">

でしたcf_sql_date。日付はcf_sql_timestamp5-31に制限されていたため、5-31の日の後半に投稿されたものはすべて省略されました。分が落ちていた。

皆様のご意見ありがとうございました。

レガシーコードの修正!

于 2012-06-01T15:54:19.867 に答える
3

どのデータベースを使用しているかはわかりませんでしたが、それが ODBC または MSSQL の場合、通常は次のようにします。

WHERE PublishedDate >= '2012-05-01'
AND PublishedDate < '2012-06-01'

基本的には、含める終了日に 1 日を追加し、小なり演算子を使用します。時刻を省略することで、日付が内部でどのように構築されるかについての奇妙さを防ぐことができます。

于 2012-06-01T15:28:21.813 に答える
1

timepartfrom datetimeを削除して比較してみてください。だからあなたbetweenは次のように見えるはずです

WHERE PublishedDate BETWEEN '2012-05-01' AND '2012-05-31'
于 2012-06-01T15:32:46.767 に答える