ここから本文です

oracleで、timestamp型のデータに対して、where句の条件に yyyymmddhhmmss(秒まで...

eee********さん

2014/11/2722:19:57

oracleで、timestamp型のデータに対して、where句の条件に yyyymmddhhmmss(秒までの値)を指定してselectしたいです。

この時、timestamp型のデータのミリ秒以下を切り捨てて比較したいのですが、どのような関数を使えば良いでしょうか?

補足20140101000000と一致する行を取得するとき、DBのtimestamp型のデータが20140101000000111111111の時にでも一致させたいです。

閲覧数:
14,884
回答数:
2

違反報告

ベストアンサーに選ばれた回答

sun********さん

2014/11/3000:34:21

単純にTO_CHAR()関数を使えばよいのでは。

WHERE to_char(timestamp列, 'YYYYMMDDHH24MISS') = '20140101000000'


但し、列を関数で加工してしまっているため、通常の索引は使えません。
索引を使うためにはファンクション索引を使う必要があることに注意が必要です。

もしくは、

WHERE timestamp列 >= TO_TIMESTAMP('20140101000000', 'YYYYMMDDHH24MISS')
AND timestamp列 < TO_TIMESTAMP('20140102000000', 'YYYYMMDDHH24MISS')

とするか。
こちらは式は長くなりますが、通常索引が使えると思います。

この質問は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

wx1********さん

2014/12/109:52:05

WHERE "列名" BETWEEN TO_TIMESTAMP('20141201123456000000000', 'YYYYMMDDHH24MISSFF') AND TO_TIMESTAMP('20141201123456999999999', 'YYYYMMDDHH24MISSFF')

で良いでしょう。ミリ秒の精度は環境やTABLE定義によっても異なりますが、9桁までが上限だと思います。上記は000000000から999999999までのミリ秒指定を行いましたが、ミリ秒を3桁しか取っていないなら000から999までで十分です。


余談ですが、TIMESTAMP型って内部のサイズが意外と大きいようで、20byteも要するようです。DUMP関数で見てみればわかります。

個人的には、無駄に肥大化してしまうのが嫌で使うのをやめました。NUMBER型で保管すれば、20141201なんて5byteで済みますね。常に固定長で確保しておきたい場合は常に20byteを取るTIMESTAMP型も有効ですが、一度入れたらそれっきりで見ることすら無いようなログに添える時刻などは、チリも積もれば何とやらです。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる