0

列の 1 つに昨日の日付がある ORACLE テーブルからレコードを取得しようとしています。昨日のレコードのみを取得する仕事を毎日実行しています。

注**列insert_dateは型ですdate

これらは、これまでに使用した 2 つの SQL ステートメントです。

SELECT distinct column1
  FROM table1
 WHERE flag = 'N'  
   AND insert_date BETWEEN TRUNC(CURRENT_DATE-1) AND TRUNC(CURRENT_DATE) 
   AND ipaddress IS NOT NULL
   AND ipaddress <> '0.0.0.0';

SELECT distinct column1 
  FROM table1
 WHERE flag = 'N'  
   AND insert_date 
       BETWEEN To_Timestamp(CONCAT (to_char(CURRENT_DATE-1),' 12:00:00 AM')) 
           AND To_Timestamp(Concat (to_char(CURRENT_DATE-1),' 11:59:59 PM')) 
   AND ipaddress IS NOT NULL 
   AND ipaddress <> '0.0.0.0';

これら 2 つの SQL ステートメントは同じ出力を生成するようです。ただし、私は ORACLE の専門家ではないので、私が気付いていない「落とし穴」があるかどうかをコミュニティに尋ねたいと思います。

4

3 に答える 3

0

これを試して:

SELECT distinct column1
 FROM table1
 WHERE flag = 'N'  AND
  insert_date = trunc(sysdate-1,'DD')
   and ipaddress is not null and ipaddress<>'0.0.0.0';

最初のクエリは正常に機能しますがbetween、1 日のデータをフィルター処理する場合は使用する必要がない場合があります。

于 2013-09-26T19:41:47.307 に答える
0

between を使用しますが、終了日から 1 秒減算します。

insert_date between trunc(CURRENT_DATE-1) and trunc(CURRENT_DATE) - 1/86400
于 2013-09-26T19:42:30.800 に答える
0
to_Timestamp(Concat (to_char(CURRENT_DATE-1),' 12:00:00 AM')) 

は非常に不必要であり、それが他のアプローチの理由であると思います ( trunc(current_date-1))

私が見ることができる唯一の「落とし穴」は、正確に午前 12:00:00の日付を持つレコードが2 番目のクエリに含まれますが、最初のクエリには含まれないことです。

この種の問題をチェックする非常に簡単な方法があります。

SELECT distinct column1
FROM table1
WHERE flag = 'N'  AND insert_date between trunc(CURRENT_DATE-1)
    and trunc(CURRENT_DATE) and ipaddress is not null and ipaddress<>'0.0.0.0';
MINUS
SELECT distinct column1 
FROM table1
WHERE flag = 'N'  
      AND insert_date between To_Timestamp(Concat (to_char(CURRENT_DATE-1),' 12:00:00 AM'))                         and To_Timestamp(Concat (to_char(CURRENT_DATE-1),' 11:59:59 PM')) 
      and ipaddress is not null and ipaddress<>'0.0.0.0';

SELECT distinct column1 
FROM table1
WHERE flag = 'N'  
      AND insert_date between To_Timestamp(Concat (to_char(CURRENT_DATE-1),' 12:00:00 AM'))                         and To_Timestamp(Concat (to_char(CURRENT_DATE-1),' 11:59:59 PM')) 
      and ipaddress is not null and ipaddress<>'0.0.0.0';
MINUS
SELECT distinct column1
FROM table1
WHERE flag = 'N'  AND insert_date between trunc(CURRENT_DATE-1)
    and trunc(CURRENT_DATE) and ipaddress is not null and ipaddress<>'0.0.0.0';

これらのクエリのいずれかから結果が得られる場合は、2 つのアプローチが完全に等しくないことを意味します。

于 2013-09-26T19:44:22.107 に答える