ひでっぷの技術メモ

はてなダイアリーから移行しました

SYSDATEとSYSTIMESTAMP

oracleサーバーから日付をとってくる関数にSYSDATEという関数があります。
使い方は


SELECT SYSDATE FROM DUAL;

2006/06/22 12:08:05のように返ってきます。
DATE型なので何月何日何時何分何秒までしかとれません。

もっと細かくデータが欲しい場合はSYSTIMESTAMPを使用します。


SELECT SYSTIMESTAMP FROM DUAL;

2006/06/22 12:08:05.012のように返ってきます。
ただし!oracle9i以降でしか使用できません。


今回の仕事で複数PCで画面を同期して出したり消したりしています。
oracleDBにデータ更新時間と更新された画面情報を入れて、自分が保持している時間より更新時間が進んでいれば(誰かが更新したことになる)
画面情報を見て出すか消すかを決める。
みたいなことをしているのですが、
画面を出すほうは問題ないのですが、画面を消すほうで消し忘れが出てくる。
よく調べてみると、画面をがんがん消すと別PC側で消し忘れが出てくるようです。
んで、さらにさらに調べてみると前述してある問題にたどりつきました。
更新時間はDATE型。
ということは1秒以内に複数の画面が消去されると更新時間に変化がないということになるのです・・・。
さらにうちの会社でテストしているoracleは8iなのでSYSTIMESTAMPは使えない。
現地は10gを使っているけれど、DBの型変更からやり直すのは辛い・・・。
結局画面が1秒以内に消されないように工夫しました。

今まではアクションを起こす画面は自分で即座に画面を消去していましたが、それをやめてアクションを起こした側も更新時間を見て画面消去をするように変更しました。
更新時間が変わったかを見に行く周期は1秒間隔なので最大1秒近く画面消去が遅れることになりますが仕方ありません・・・。

しかし、oracleには悩まされ続けるなあ。
現地の8iはうちのよりさらにバージョンが古くてDATE型での検索でエラーが出てたし(ヲイ
そんな根本的なところでエラーがでてもらっちゃ困るよぅ