- PR -

Oracleで日付をキーにして抽出したい

1
投稿者投稿内容
nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2004-09-23 17:02
お世話になっております。

Oracle9iを使用しています。
Date型の項目をキーにして抽出したレコードを削除したいと思っています。

sql = "DELETE FROM TABLE_A WHERE SINSEIBI=" & in_ymd

[in_ymd]は当モジュールの実行時に引数として渡されます。

現在のテーブルの内容:11-9 -2004 12:00:00 AM
引数の値      :#9/11/2004#
実際に生成されたSQL文:
"DELETE FROM TABLE_A TABLE_A.SINSEIBI = 2004/09/11"

結果、削除実行時にエラーになりました。
エラーメッセージは以下のとおりです。
---------------------------------------------------
コマンド処理中に 1 つ以上のエラーが発生しました。
ORA-00932: データ型が一致しません: DATEが予想され
ましたがNUMBERです。
---------------------------------------------------

テーブルのデータ型はDATEになっています。

皆様、お忙しいところ申し訳ございませんが、
よろしくお願いいたします。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2004-09-23 17:12
文字どうりそのエラーでは、おそらくなんかの言語からそのSQLを発行して
in_ymd に値を設定して実行するわけですが、その引き渡すときに、その変数のタイプ
の指定がおかしいのでは?
杏仁豆腐
常連さん
会議室デビュー日: 2003/10/04
投稿数: 48
お住まい・勤務地: あっち・なぜか平和だったところ(T_T)
投稿日時: 2004-09-23 17:22
SQL*Plusなどで次のようにSQL文を流してみるとこうなります。

コード:
SQL> select 2004/09/11 from dual;

2004/09/11
----------
20.2424242



2004/09/11 の部分は 2004÷9÷11 という数値として扱われていますね。

SINSEIBIはDATE型ということなので、入力する日付を以下のようにDATE型に
変換してやるSQL文を生成するようにプログラムを直せば動くと思います。

"DALETE FROM TABLE_A WHERE TABLE_A.SINSEIBI = TO_DATE('2004/09/11', 'YYYY/MM/DD')"
nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2004-09-23 17:39
七味唐辛子様、MechanicalLife様

早速のアドバイスありがとうございます!
TO_DATEを使って削除に成功しました☆彡

今後とも宜しくお願い致します。
杏仁豆腐
常連さん
会議室デビュー日: 2003/10/04
投稿数: 48
お住まい・勤務地: あっち・なぜか平和だったところ(T_T)
投稿日時: 2004-09-23 20:37
おまけです。

DATE型は時間を持っているので、日付を変換しても比較する値との時間が違うと
同じとは見られなくなります。

コード:
SQL> SELECT DECODE(TO_DATE('2004/09/11 12:00:00 午前', 'YYYY/MM/DD HH12:MI:SS AM'),
  2                TO_DATE('2004/09/11', 'YYYY/MM/DD') , '同じだよ', '違うよ')
  3    FROM DUAL;

DECODE(T
--------
同じだよ

SQL> SELECT DECODE(TO_DATE('2004/09/11 12:00:01 午前', 'YYYY/MM/DD HH12:MI:SS AM'),
  2                TO_DATE('2004/09/11', 'YYYY/MM/DD') , '同じだよ', '違うよ')
  3    FROM DUAL;

DECODE
------
違うよ


日付だけを指定して、TO_DATE()関数を使って DATE型に変換した場合の時間は次のようになります。

コード:
【12時間表示】
SQL> SELECT TO_CHAR(TO_DATE('2004/09/11', 'YYYY/MM/DD'),
                    'YYYY/MM/DD HH12:MI:SS AM')
       FROM DUAL;

TO_CHAR(TO_DATE('2004/09
------------------------
2004/09/11 12:00:00 午前

【24時間表示】
SQL> SELECT TO_CHAR(TO_DATE('2004/09/11', 'YYYY/MM/DD'),
                    'YYYY/MM/DD HH24:MI:SS')
       FROM DUAL;

TO_CHAR(TO_DATE('20
-------------------
2004/09/11 00:00:00


なんか、12:00:00 午前 = 00:00:00(24時間表示) みたいです。
じゃぁ、1秒遡ると

コード:
【12時間表示】
SQL> SELECT TO_CHAR(TO_DATE('2004/09/11', 'YYYY/MM/DD') - (1/24/60/60),
                    'YYYY/MM/DD HH12:MI:SS AM')
       FROM DUAL;

TO_CHAR(TO_DATE('2004/09
------------------------
2004/09/10 11:59:59 午後

【24時間表示】
SQL> SELECT TO_CHAR(TO_DATE('2004/09/11', 'YYYY/MM/DD') - (1/24/60/60),
                    'YYYY/MM/DD HH24:MI:SS')
       FROM DUAL;

TO_CHAR(TO_DATE('20
-------------------
2004/09/10 23:59:59


一時間後だと

コード:
【12時間表示】
SQL> SELECT TO_CHAR(TO_DATE('2004/09/11', 'YYYY/MM/DD') + (1/24),
            'YYYY/MM/DD HH12:MI:SS AM')
       FROM DUAL;

TO_CHAR(TO_DATE('2004/09
------------------------
2004/09/11 01:00:00 午前

【24時間表示】
SQL> SELECT TO_CHAR(TO_DATE('2004/09/11', 'YYYY/MM/DD') + (1/24),
            'YYYY/MM/DD HH24:MI:SS')
       FROM DUAL;

TO_CHAR(TO_DATE('20
-------------------
2004/09/11 01:00:00



午前12時の次が午前1時みたい・・・
なっとくできな〜い。(^-^;
1

スキルアップ/キャリアアップ(JOB@IT)