- ベストアンサー
SQLがうまくいかない!
SQLがうまくいかない! SQLについて、調べたんですが、わからないので教えてください! last_year(日付データ)関数 と round(日付データ,'書式')関数についてのご質問です。 select last_year('2007-01-01') from 表名; とやるとうまくいくのに 、 select round('2007-01-01','month') from 表名; とやるとエラーになってしまいます。 last_year関数では、'2007-01-01'は日付データとして扱われるのに、round関数では日付データとして扱われないのはなんででしょう? ちなみに、 select round(to_date('2007-01-01','yy-mm-dd'),'month') from 表名; とやるとうまくいきます・・・SQLの仕様ですか!? どなたか教えてください!宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
日付型(DATE型)のみをパラメータとして認める関数は、与えられた文字列定数を、DATE型に暗黙の型変換し処理しますが、 round関数のように、日付型に限定しない関数については、与えられた文字列をどう扱うか判断がつきません。 故にエラーとされたのでしょう。 ちなみに、日付型のみを受け付ける関数であっても、環境によって日付書式のデフォルト書式が変わるので、 同じSQLが環境によって動いたり動かなかったりします。 暗黙の型変換を多用する人が陥るパターンです。
その他の回答 (3)
- masa-it
- ベストアンサー率37% (9/24)
こんにちは、 一つ確認ですが、last_year() → last_day() ではないですか? last_day関数ですが 第一引数はNUMBERしか用意してない様ですね、 ROUND関数は、NumberとDateの2個用意されている様ですね。 ※ちなみに、日付や時間の四捨五入ってどんな要件で使うのですかね? SQL> select to_char(round(to_date('2007-01-15','yyyy-mm-dd'),'month'), 'YYYY/MM/DD HH:MI:SS') from dual; ------------------- 2007/01/01 12:00:00 SQL> select to_char(round(to_date('2007-01-16','yyyy-mm-dd'),'month'), 'YYYY/MM/DD HH:MI:SS') from dual; ------------------- 2007/02/01 12:00:00
お礼
ご回答ありがとうございます。 すいません。ご指摘の通り、last_yearではなく、last_day関数です。 申し訳有りません。 どうやら、暗黙の型変換ができなくてエラーになっていたようです。 ありがとうございました!
先ほどの者です。 DBMSはOracleでしたね。 oracleはround関数でもdate型使えますね。 補足ですが、 一つ目のSQLがエラーになるのは、 「'2007-01-01'」が日付であることは、DBMSには判りません(あなたしかわかりません)。ただの文字列としか認識できません。 よって、DBMSはデータをどのように加工すればよいかわからず、 エラーを出すしかありません。 to_date関数は第一引数がStringを許す代わりに、第二引数にDBMSが解釈できるように、書式を渡しているでしょ? 関係ないことですが、自分の回答に追加で補足できるようにならないのかなぁ~
DBMSが判らないので参考程度で。 round関数は四捨五入する関数なので、通常は第一引数、第二引数共にinteger型だと思います。 ですから、 「select round('2007-01-01','month') from 表名;」 がエラーになるのは当然です。 次に 「select round(to_date('2007-01-01','yy-mm-dd'),'month') from 表名;」 はエラーが出ないとのことですので、 あなたの使用しているDBMSのround関数は、 第一引数がDate型、第二引数がstring型も許されているのだと思います。 ちなみに、2つ目のSQLの結果って何が返るのですか?気になります。
お礼
回答ありがとうございます。 >ちなみに、2つ目のSQLの結果って何が返るのですか?気になります。 select round(to_date('2007-01-01','yy-mm-dd'),'month') from 表名; とやると、2007-01-01が返ってきます(当たり前ですが) select round(to_date('2007-01-31','yy-mm-dd'),'month') from 表名; とやると、2007-02-01が返ってきます☆彡 ありがとうございました。
お礼
回答ありがとうございます。 なるほど。暗黙の型変換ですか! なっとくです。ありがとうございました!!