• 締切済み

【SQL】TO_DATEについて

いつもお世話になっております。 DATE型の二つのカラム(仮に、abcとxyz)があり、条件句において、月までで、abc>xyzの条件をつけたいと考えています。 現在、以下のようなソースを考えているのですが、うまくいきません。 TO_NUMBER(TO_CHAR(abc,'YYYYMM'))>TO_NUMBER(TO_CHAR(xyz,'YYYYMM')) お力をお貸しいただけませんでしょうか。 よろしくお願いします。

みんなの回答

  • necomimi
  • ベストアンサー率41% (633/1540)
回答No.2

http://www.accessclub.jp/bbs3/0341/superbeg102967.html リンク先の内容はわたしには理解できませんが SQLをご存知の方には参考になるのでは?

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.1

TO_NUMBERにせずとも、 TO_CHAR(abc,'YYYYMM')>TO_CHAR(xyz,'YYYYMM') だけでもOKな気もしますが、どのように うまくいかないのでしょうか? (エラー、期待した結果にならないetc.)

関連するQ&A

  • SQLのBetween句

    SQL初心者です。 どなたかヒントでもよいのでご教授お願いします。 分からない箇所は以下の2つです。(SQLは下方に示しています) ・where句のbetweenの箇所にカラム指定箇所にTO_CHAR(SYSDATE -2, 'YYYYMMDD') を入れた時、何を評価しているのか? ・where句のbetweenの条件部分のカラム名に(+)をつけた場合何を意味しているのか? この2つがどうしても分かりません。 このSQLについて知識お持ちに方よろしくお願いします。 環境は次の通りです。 ------------------------ ■環境 ・OracleDatabase10.2 ■テーブル構成 テーブルは以下の2つです。 ・sample1 ・sample2 sample1テーブルに以下のカラムがあります。 ・test1 sample2テーブルに以下のカラムがあります。 ・test2 ------------------------ ■SQL SELECT * FROM sample1 s1, sample2 s2 WHERE TO_CHAR(SYSDATE -2, 'YYYYMMDD') BETWEEN s1.STAYMD(+) AND s2.(+)

  • TO_DATEの使い方を教えて下さい

    Oracleを習い始めたばかりで、とても初歩的な質問ですみません。 customer_numberが124でorder_dateが09/05/98のレコードをSELECTしたいのですが、 TO_DATEを使うとうまくいきません。 その条件に合うレコードは存在して、日付をデフォルトの形で書くとSELECTできます。 TO_DATEの使い方を間違えているのでしょうか。 よろしくお願いします。 SQL> select order_number 2 from orders 3 where customer_number='124' and order_date='05-SEP-98'; ORDER ----- 12500 SQL> select order_number 2 from orders 3 where customer_number='124' and order_date=to_date('09/05/98','MM/DD/YY'); no rows selected

  • SQLの処理速度改善にむけて

    処理速度改善に向けて、3つ質問があります。 解答は1つでも良いのでお願いします。 1.検索条件が複数ある場合、もっとも絞れる物から検索するのが早いのでしょうか?   (Indexはその順番に伴い変更する事を前提)   例: where X = 3 (1000件中10件に絞れる) and Y = 4 (1000件中100件に絞れる) and Z = 5 (1000件中900件に絞れる) 上記のように、より絞れる物から検索する。 2.文字列で検索する場合、以下は同じ結果でしょうか。そしてパターン2の方が早いでしょうか   ・パターン1   where X <> 'Z' ・パターン2   where X > 'Z' and X < 'Z' 3.条件式にTO_CHARが入った場合、indexカラムの場合、遅くなるでしょうか?   下記SQLを直すとした場合、どのように直せるでしょうか? SELECT * from X,Y where TO_CHAR(X.DATE,'YYYYMM') = Y.DATE2(+)

  • PL/SQLでのTO_DATEの時間取得について

    お世話になります。 PL/SQLでDATE型のデータの日時を取得する方法を教えてください。 PL/SQLでDBの値を、TO_CHARで取ってきて、その値をTO_DATEすると、時刻が落ちてしまいます。 charWorkEndDate VARCHAR2(20); dtWorkEndDate DATE; charWorkEndDate := to_char(V00061_Rec.S_DATE5, 'YYYY/MM/DD HH24:MI:SS'); dtWorkEndDate := to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'); 出力結果 --charWorkEndDate- [2005/12/25 06:00:19] --dtWorkEndDate- [05-12-25] to_dateの1つ目の引数にシングルクォーテーションが必要かと思い、 dtWorkEndDate := to_date('''||charWorkEndDate||''', 'YYYY/MM/DD HH24:MI:SS'); としてみたのですが、その場合、「ORA-01841: (周)年は-4713と+9999の間の0以外の数を指定する必要があります」とのエラーが出てしまいます。 どなたかDATE型のデータの時刻を取る方法をご存知でしたら、教えていただけますでしょうか。 よろしくお願いします。

  • 構造体や配列へのポインタについての質問です

    いつもお世話にばっかりなっているものですが、 表題の件で質問です。 ある関数で定義した構造体や配列へのポインターを、 他の関数で処理する方法ですが、 以下のやり方であっているでしょうか? typedef struct _abc { char name[50]; int value; } abc; の場合 void func_from() { abc xyz; char * y[2]; y[0] = xyz.name; y[1] = ( char * )&xyz.value; func_to( y, &xyz ); } void finc_to( char ** x, abc * pqr ) { *x = pqr->name; *( x + 1 ) = ( char * )&( *pqr ).value; } 上の例、数値は(char *)型にして入れる仕様だと思ってください。 本番バージョンはもっと違うのですが、 コンパイルエラーなく動いている、みたいです;D ただ、ぜんぜん自信がないので、 大丈夫だよと一言言ってもらえるか、 そらあかんは、というコメントお待ちしていますm(__)m

  • SQLのカーソルについて

    SQLのカーソルについて質問があります。 OPEN CURSOR1; LOOP OPEN CURSOLR2; LOOP ・・・・ END LOOP; CLOSE CURSOR2; END LOOP; CLOSE CURSOR1; みたいな構文は可能ですか??? また2008というNUMBER型の数字と、4というNUMBER型数字を年月と認識させるために、TO_DATE(2008*100+4,'YYYYMM')→DATE型の200804と認識できる?? ということについて教えてください。

  • to_date使用時に発生するエラーの対処方法について

    Oracle8iにおいて、日付1(date1)カラムは2007年6月5日12時25分20秒というようにvarchar2(14)で定義されており、時分秒でデータを持っています。 それを年月単位で件数をカウントしたいため、 to_dateで変換をかけているのですが(以下のSQL参照)、ORA-1830の エラーが発生してしまいます。 以下のSQLをどのように修正すれば正しく結果が得られるのでしょうか?ご教示下さい。 select to_date(date1,'YYYYMMDD'),count(*) from tableA where date1 >= '20070501000000' group by to_date(date1,'YYYYMMDD') ちなみに、to_dateのところを、to_charにしてみると、ORA-1481が発生してしまいます。

  • SQL 副問い合わせ

    以下のaテーブルのcardidと、bテーブルのnoが同じで、 かつ、bテーブルのryodtmが前月のデータを抽出する以下のsqlを、 aテーブルのcardidが、bテーブルのnoと同じで、かつ、ryodtmが前月分、 または、cテーブルのchangcardと同じで、かつ、ryodtmが前月分のを抽出する場合、 どうすればいいでしょうか? select * from a where cardid in ( select distinct(no) from b where kdncresbt ='1' and ryodtm >= TO_CHAR(ADD_MONTHS(TRNC(SYSDATE,'MONTH'), -1),'YYYYMM' ) || '01' and ryodtm < TO_CHAR(SYSDATE,'YYYYMM') || '01' )

  • Oracle データベース SQL

    質問させてください。 SQLについて教えてください。 SELECT文を作っていて、WHERE句で データを追加した日の指定(INSERT_DATE)を本日、というのをしたいと思っているのですが、なかなかできません。 格納するデータ型は、CHAR型なので WHERE INSERT_DATE =  TO_CHAR(SYSDATE, 'YYYYMMDD') で、試したのですができません…。 SQL実行はするのですが、該当なしになります。 教えていただければ、助かります。

  • DB2 SQLチューニングについて

    いつもお世話になっております。 DB2のSQLチューニングで改善案が浮かばず どなたかお知恵を拝借したい次第です。 現状は複数テーブルをJOINで結合したものを DISTINCTでまとめています。 ですが、あまりにもデータ量が多くCPUに負荷がかかり、 SQLエラーを起こしてしまいます。 もはやレスポンス改善以外の道がないのですが、 以下は試しても改善されませんでした。 ・DITINCTをやめて単純なSELECTのみとして、  まとめはJavaロジックで実施  SQLは重いまま。 ・結合条件をサブクエリに変えて実施  余計に遅くなり、返ってこなくなった。 上記を施す前のSQLは以下です。 テーブルは4つ(A1, A2, A3, A4) SELECT DISTINCT A1.AAA A1.BBB A1.CCC A2.DDD A2.EEE A2.FFF A2.GGG A3.HHH A3.JJJ A3.KKK A3.LLL A3.MMM A3.NNN A3.OOO A4.PPP A4.QQQ A4.RRR A4.XXX A4.YYY A4.ZZZ FROM DB.A1TBL A1 INNER JOIN DB.A2TBL A2 ON SUBSTR(A2.START_DATE,1,6) <= パラメータ1(YYYYMM形式) AND A2.END_DATE > CONCAT(パラメータ1(YYYYMM形式), '01') AND A1.NUMBER = A2.NUMBER AND A1.MACHIN_ID = A2.MACHIN_ID AND A1.TYPE = A2.TYPE AND A2.DELETE_DATE > CURRENT TIMESTAMP INNER JOIN DB.A3TBL A3 ON SUBSTR(A3.START_DATE,1,6) <= パラメータ1(YYYYMM形式) AND A2.END_DATE > CONCAT(パラメータ1(YYYYMM形式), '01') AND A2.NUMBER = A3.NUMBER AND A2.MACHIN_ID = A3.MACHIN_ID AND A2.TYPE = A3.TYPE AND A2.COLOR = A3.COLOR AND A3.DELETE_DATE > CURRENT TIMESTAMP LEFT OUTER JOIN DB.A4TBL A4 ON STANDARD_MM = パラメータ1(YYYYMM形式) AND A3.END_DATE > CONCAT(パラメータ1(YYYYMM形式), '01') AND A3.NUMBER = A4.NUMBER AND A3.MACHIN_ID = A4.MACHIN_ID AND A3.IN_PLACE_CD = A4.IN_PLACE_CD AND A3.OUT_PLACE_CD = A4.OUT_PLACE_CD AND A3.TYPE = A4.TYPE AND A3.COLOR = A4.COLOR AND A4.DELETE_DATE > CURRENT TIMESTAMP WHERE A1.NUMBER = パラメータ0 AND SUBSTR(A1.START_DATE,1,6) <= パラメータ1(YYYYMM形式) AND A1.END_DATE > CONCAT(パラメータ1(YYYYMM形式), '01') AND A3.KBN LIKE '%' AND A2.ITEM_CD LIKE '%' AND A1.TYPE LIKE '%' AND A2.MACHIN_ID LIKE '%' AND A1.DELETE_DATE > CURRENT TIMESTAMP FOR FETCH ONLY 以上です。 何卒宜しくお願い致します。

専門家に質問してみよう