2016-07-09 7 views
0

この2つのSQLクエリは、日付と時刻の基準が異なるだけです。データを返します。データを返すSQLクエリの問題を解決しようとしています

クエリ -

SELECT * 
FROM CA_CLN_CAPM_TRANSPORT, 
    CA_ENCOUNTER_REF TRANSPORT_PATIENT_ENCOUNTER, 
    (SELECT DISTINCT TRANSPORT_PATIENT_ATTRIBUTES.ENCOUNTER_ID, 
    TRANSPORT_PATIENT_ATTRIBUTES.ATTRIBUTE_NAME 
    FROM CA_CAPM_ENCOUNTER_ATTR TRANSPORT_PATIENT_ATTRIBUTES, 
    CA_CLN_CAPM_TRANSPORT 
    WHERE (CA_CLN_CAPM_TRANSPORT.SCHEDULED_DTTM BETWEEN TRANSPORT_PATIENT_ATTRIBUTES.EFF_BEGIN_DTTM AND NVL(TRANSPORT_PATIENT_ATTRIBUTES.EFF_END_DTTM,SYSDATE) 
    OR NVL(CA_CLN_CAPM_TRANSPORT.COMPLETE_DTTM,SYSDATE) BETWEEN TRANSPORT_PATIENT_ATTRIBUTES.EFF_BEGIN_DTTM AND NVL(TRANSPORT_PATIENT_ATTRIBUTES.EFF_END_DTTM,SYSDATE) 
    OR TRANSPORT_PATIENT_ATTRIBUTES.EFF_BEGIN_DTTM BETWEEN CA_CLN_CAPM_TRANSPORT.SCHEDULED_DTTM AND NVL(CA_CLN_CAPM_TRANSPORT.COMPLETE_DTTM,SYSDATE)) 
    AND CAST(CA_CLN_CAPM_TRANSPORT.SCHEDULED_DTTM AS DATE) BETWEEN '30-06-2016 12:00:00' AND **'30-06-2016 23:59:00'** 
) PATIENT_ATTRIBUTES 
WHERE CA_CLN_CAPM_TRANSPORT.ENCOUNTER_ID  = TRANSPORT_PATIENT_ENCOUNTER.ENCOUNTER_ID 
AND TRANSPORT_PATIENT_ENCOUNTER.ENCOUNTER_ID = PATIENT_ATTRIBUTES.ENCOUNTER_ID(+) 
AND TRANSPORT_PATIENT_ENCOUNTER.PATIENT_ID <> '0' 
AND CAST(CA_CLN_CAPM_TRANSPORT.SCHEDULED_DTTM AS DATE) BETWEEN '30-06-2016 12:00:00' AND **'30-06-2016 23:59:00'**; 

クエリデータを返さない -

SELECT * 
FROM CA_CLN_CAPM_TRANSPORT, 
    CA_ENCOUNTER_REF TRANSPORT_PATIENT_ENCOUNTER, 
    (SELECT DISTINCT TRANSPORT_PATIENT_ATTRIBUTES.ENCOUNTER_ID, 
    TRANSPORT_PATIENT_ATTRIBUTES.ATTRIBUTE_NAME 
    FROM CA_CAPM_ENCOUNTER_ATTR TRANSPORT_PATIENT_ATTRIBUTES, 
    CA_CLN_CAPM_TRANSPORT 
    WHERE (CA_CLN_CAPM_TRANSPORT.SCHEDULED_DTTM BETWEEN TRANSPORT_PATIENT_ATTRIBUTES.EFF_BEGIN_DTTM AND NVL(TRANSPORT_PATIENT_ATTRIBUTES.EFF_END_DTTM,SYSDATE) 
    OR NVL(CA_CLN_CAPM_TRANSPORT.COMPLETE_DTTM,SYSDATE) BETWEEN TRANSPORT_PATIENT_ATTRIBUTES.EFF_BEGIN_DTTM AND NVL(TRANSPORT_PATIENT_ATTRIBUTES.EFF_END_DTTM,SYSDATE) 
    OR TRANSPORT_PATIENT_ATTRIBUTES.EFF_BEGIN_DTTM BETWEEN CA_CLN_CAPM_TRANSPORT.SCHEDULED_DTTM AND NVL(CA_CLN_CAPM_TRANSPORT.COMPLETE_DTTM,SYSDATE)) 
    AND CAST(CA_CLN_CAPM_TRANSPORT.SCHEDULED_DTTM AS DATE) BETWEEN '30-06-2016 12:00:00' AND **'01-07-2016 23:59:00'** –Running for longer time frame 
) PATIENT_ATTRIBUTES 
WHERE CA_CLN_CAPM_TRANSPORT.ENCOUNTER_ID  = TRANSPORT_PATIENT_ENCOUNTER.ENCOUNTER_ID 
AND TRANSPORT_PATIENT_ENCOUNTER.ENCOUNTER_ID = PATIENT_ATTRIBUTES.ENCOUNTER_ID(+) 
AND TRANSPORT_PATIENT_ENCOUNTER.PATIENT_ID <> '0' 
AND CAST(CA_CLN_CAPM_TRANSPORT.SCHEDULED_DTTM AS DATE) BETWEEN '30-06-2016 12:00:00' AND **'01-07-2016 23:59:00'**; 
+0

(I)私は信頼し、何の副作用は(同時更新/削除...)はありません。 (ii)データを返す内側の 'SELECT'を確認しましたか? (iii)内部結合に同じ問題があるかどうかチェックしましたか? (iv)日付変換を明示的にすることを検討しましたか? (今は12時間と36時間分のデータを比較しているように見えます。)(v)** CA_CLN_CAPM_TRANSPORT.SCHEDULED_DTTM **のデータはどのようなもので、** NLS_LANG **設定は何ですか? (vi)あなたは本当に(6月末から始まって7月に)伸びていくのですか? (vii)データやエラーメッセージが表示されないだけですか? – Abecee

答えて

0

問題は、日付・時刻の値を表す文字列の使用です。私たちはあなたの文字列でDUMP()を実行すると、私たちはこれを取得:

SQL> select dump('30-06-2016 12:00:00') as dt 
    2 from dual 
    3/

DT 
----------------------------------------------------------------------- 
Typ=96 Len=19: 51,48,45,48,54,45,50,48,49,54,32,49,50,58,48,48,58,48,48 

SQL> 

Typ=96は、それがa CHAR value(日付はTyp=12だろう)であることを意味します。したがって、Oracleは操作に文字セマンティクスを適用します。効果本で...

x BETWEEN '30-06-2016 12:00:00' AND '01-07-2016 23:59:00' 

...明らかにナンセンスである

'30' >= '30' AND '30' <= '01' 

... ...に評価されます。

何をする必要が書式マスクを明示的なキャストを使用している:

BETWEEN to_date('30-06-2016 12:00:00', 'DD-MM-YYYY HH24:MI:SS') 
    AND to_date('01-07-2016 23:59:00', 'DD-MM-YYYY HH24:MI:SS') 
+0

OPのクエリで日付が '' 2016-07-01 23:59:00 "と書かれていた場合、クエリは文字列として比較し、正しい結果を得るという闘いのチャンスがあります。 2つの文字列を比較すると、どの文字列が大きいかを決定するために左から右へ文字で表示されます。それは文字列の "意味"を考慮しません。適切な解決策(私は答えに同意し、別の言葉で言い直す)は、すべての文字列を 'DATE'型に変換して比較することです。 –

+0

ISOの日付リテラル 'date '2016-07-01 23:59:00''を' to_char'関数の代わりに使うことができます。 – krokodilko

+0

@ APC、@Peter M:http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements002.htm suggests "文字値とDATE値を比較すると、Oracleは文字データをDATEに変換します"だから、なぜ 'CAST(CA_CLN_CAPM_TRANSPORT.SCHEDULED_DTTM AS DATE)'は** DATE **比較セマンティクスをタスクに持たないのですか? – Abecee

関連する問題