1

Microsoft Query からクエリを実行すると正しい結果が得られますが、SQLPLUS(Oracle) からクエリを実行すると正しくない結果が得られます。

Microsoft Query は次のとおりです (6 月 12 日午後 3 時から 6 月 13 日午前 12 時までの正しい結果が表示されます。

SELECT 
      NAME,
      CIM,
      NUM_of_People,
      STARTDATETIME
From Table
WHERE (SUSTAINED_FLAG=1) 
AND (PLANNED_FLAG=0) 
AND (STARTDATETIME>{ts '2013-06-12 04:00:00'} 
And STARTDATETIME<{ts '2013-06-13 12:00:00'})



Oracle では、間違った結果をもたらすこの句を使用しています。
6 月 13 日午前 12 時から午後 12 時までの日付のみのクエリ結果を表示しています。

SELECT 
        NAME,
        CIM,
        NUM_of_People,
        TO_CHAR(STARTDATETIME,'MM/DD/YYYY HH:MI:SS') As STARTDATETIME
FROM OBVWH.  
where  BETWEEN To_Date(to_char(STARTDATETIME, 'DD-MON-YYYY')) >= To_Date('06/12/2013 16:00:00','MM/DD/YYYY HH24:MI:SS') 
and To_Date(to_char(STARTDATETIME, 'DD-MON-YYYY')) <= To_Date('06/13/2013 12:00:00','MM/DD/YYYY HH24:MI:SS') 
and sustained_flag = 1 and planned_flag = 0 ORDER BY STARTDATETIME ASC
4

1 に答える 1

4

この問題が発生している理由は、where 句にあるためです。

To_Date(to_char(STARTDATETIME, 'DD-MON-YYYY'))

それがしていることは、日付から時間要素を取り除いて、すべてが事実上真夜中になるようにすることです。これの簡単な例は

SELECT CASE
       WHEN to_date(to_char(SYSDATE, 'DD-MON-YYYY')) = SYSDATE THEN
        'yes'
       ELSE
        'no'
   END
FROM   dual

ご覧のとおり、sysdate の形式を 2 回変更した後、sysdate はそれ自体と等しくなくなりました。

列は日付なので、書式設定をまったく行う必要はありません。where句を次のように変更するだけです

where  STARTDATETIME >= To_Date('06/12/2013 16:00:00','MM/DD/YYYY HH24:MI:SS') 
and    STARTDATETIME <= To_Date('06/13/2013 12:00:00','MM/DD/YYYY HH24:MI:SS') 
and sustained_flag = 1 and planned_flag = 0 ORDER BY STARTDATETIME ASC
于 2013-06-26T13:31:46.860 に答える