こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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の仕様ですか!?
どなたか教えてください!宜しくお願い致します。

投稿日時 - 2007-04-15 23:34:26

QNo.2924477

すぐに回答ほしいです

質問者が選んだベストアンサー

日付型(DATE型)のみをパラメータとして認める関数は、与えられた文字列定数を、DATE型に暗黙の型変換し処理しますが、
round関数のように、日付型に限定しない関数については、与えられた文字列をどう扱うか判断がつきません。
故にエラーとされたのでしょう。
ちなみに、日付型のみを受け付ける関数であっても、環境によって日付書式のデフォルト書式が変わるので、
同じSQLが環境によって動いたり動かなかったりします。

暗黙の型変換を多用する人が陥るパターンです。

投稿日時 - 2007-04-16 12:49:51

お礼

回答ありがとうございます。
なるほど。暗黙の型変換ですか!
なっとくです。ありがとうございました!!

投稿日時 - 2007-04-16 21:18:20

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

こんにちは、

一つ確認ですが、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

投稿日時 - 2007-04-16 14:28:20

お礼

ご回答ありがとうございます。
すいません。ご指摘の通り、last_yearではなく、last_day関数です。
申し訳有りません。
どうやら、暗黙の型変換ができなくてエラーになっていたようです。
ありがとうございました!

投稿日時 - 2007-04-16 21:19:54

ANo.2

先ほどの者です。

DBMSはOracleでしたね。
oracleはround関数でもdate型使えますね。

補足ですが、
一つ目のSQLがエラーになるのは、
「'2007-01-01'」が日付であることは、DBMSには判りません(あなたしかわかりません)。ただの文字列としか認識できません。
よって、DBMSはデータをどのように加工すればよいかわからず、
エラーを出すしかありません。

to_date関数は第一引数がStringを許す代わりに、第二引数にDBMSが解釈できるように、書式を渡しているでしょ?

関係ないことですが、自分の回答に追加で補足できるようにならないのかなぁ~

投稿日時 - 2007-04-16 11:25:32

ANo.1

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の結果って何が返るのですか?気になります。

投稿日時 - 2007-04-16 11:09:18

お礼

回答ありがとうございます。
>ちなみに、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が返ってきます☆彡
ありがとうございました。

投稿日時 - 2007-04-16 16:24:59

あなたにオススメの質問