postgreSQLでの日付型比較について

このQ&Aのポイント
  • postgreSQLで日付型の比較方法について質問があります。具体的には、文字列として取得した日付を日付型と比較する際に、なぜ正しく比較できるのか疑問です。
  • 質問の具体的な例として、postgreSQLでデータベースのテーブルから日付を取得し、日付型として比較する場合、文字列として取得した日付も正しく比較できます。これはなぜでしょうか?
  • また、質問の例として挙げたSQLでは、CURRENT_DATEとSUBSTR関数を使用して文字列から日付を取得しています。この場合、RDBMSが自動的に文字列を日付型に変換してくれるのでしょうか?
回答を見る
  • ベストアンサー

postgreSQLで分からないことがあります。

postgreSQLで分からないことがあります。 よろしくお願いします。 下にあるtblというテーブルがあったとき。 下のSQLを実行するとデータがうまく取れているんですが、 CURRENT_DATEは日付型でSUBSTRでとりだした日付は文字列 なのに何故正しく比較できているのでしょうか? 日付型の形式の文字列であれば、RDBMSがかってに日付型にしてくれるのでしょうか? tblテーブル *sdateとedateはtimestamp型です。 sdate      | edate | ----------------------------------------- 2010-5-1 10:00:00 | 2010-5-2 13:00:00| SELECT * FROM tbl WHERE CURRENT_DATE BETWEEN SUBSTR(sdate, 1, 10) AND SUBSTR(edate, 1, 10)

noname#119939
noname#119939

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

  • ベストアンサー
  • med2dic
  • ベストアンサー率77% (21/27)
回答No.1

postgresqlのバージョン、バージョンが同じでもその環境によって動作が異なります。 質問をする際は最低限バージョンを明記した方が回答しやすくなります。 >CURRENT_DATEは日付型でSUBSTRでとりだした日付は文字列 >なのに何故正しく比較できているのでしょうか? >日付型の形式の文字列であれば、RDBMSがかってに日付型にしてくれるのでしょうか? ご想像のとおりです。いい感じに処理をしてもらっている状態です。 本来は日付と文字列のどちらかを変換して型をそろえる必要がありますし、SUBSTRの引数も日付型ではなく文字列を与えるべきです。 ちなみに私は8.4.1を使用していますが、提示されているようなSQLはエラーとなります。 参考URLをひととおり読んでみてください。 7.4から8.4にバージョンアップした経験があるのですが、システムで発行しているSQLがバタバタとエラーになり、日頃いい加減なSQLを書いていたのだと思い知らされました。

参考URL:
http://lets.postgresql.jp/documents/tutorial/cast/
noname#119939
質問者

お礼

ありがとうございました。 バージョンを書き忘れていてました、以後 気をつけます。 曖昧なSQLだと、バージョンをあげたときに 大変そうなので気おつけます。

関連するQ&A

  • PostgreSqlについて

    おはようございます。 質問させてください。 テーブルのカラムにtimestamp型のフィールドがあるとします。 テーブルinsertの時に現在の時間をいれたいのですが、どのような値を入れればいいのでしょうか? test_tbl-------------- ID:INTEGER DATE:TIMESTAMP ---------------------- insert into test_tbl (ID, DATE) values (1, ****); ****の部分にnow, dateとかそんな関数はあるのでしょうか?

  • ACCESS97のモジュールで 日付の計算をしたい

    以前の例題を検索したのですが 改めて質問します。 ACCESS97のモジュールで 日付の計算をしたいのです。 例えば ある日付を入力すれば、その2週間後の日付を取得したいのです。  テキストボックス "日付"で入力するとします Dim Sdate As Date  Dim Edate As Date Sdate = Format(Me.日付, "yy/mm/dd") Edate = Format(Sdate+14, "yy/mm/dd") ← ではエラーになります。 Q どうすればいいのでしょうか?

  • VBA 日付型を8桁数値へ変換

    VBAの中で、Date型の日付をバッチファイルに渡す時に、8桁数値へ変換したいのですが、0埋めのやり方が分からずに困っております。 Date型 yyyy/mm/dd 8桁数値 yyyymmdd Private Sub cmdBSubmit_Click() Dim rc As Integer Dim sDate As Date Dim eDate As Date '開始日・終了日処理 sDate = DateAdd("d", -5, txtsDate) eDate = DateAdd("d", 5, txteDate) Debug.Print "----------------------" Debug.Print "開始日-5:" & sDate Debug.Print "終了日+5:" & eDate 'パブリック変数へ、日付格納 sDateP = Year(sDate) & Month(sDate) & Day(sDate) eDateP = Year(eDate) & Month(eDate) & Day(eDate) Debug.Print "----------------------" Debug.Print "開始日:" & sDateP Debug.Print "終了日:" & eDateP rc = MsgBox("開始日 : " & sDate & vbCrLf & _ "終了日 : " & eDate & vbCrLf & _ "抽出を開始します宜しいですか?", vbYesNo + vbQuestion, "確認") If rc = vbYes Then '集計バッチを実行 'MsgBox "実行" Call 抽出 Else '中止 MsgBox "中止" End If End Sub 'パブリック変数へ、日付格納 sDateP = Year(sDate) & Month(sDate) & Day(sDate) eDateP = Year(eDate) & Month(eDate) & Day(eDate) この書き方だと、月・日が一桁の場合、例えば「2013/01/01」だと、”201311”になってしまいます。 これを、"20130101"にしたいのですが、どう書けば宜しいでしょか? 最初から、8桁日付で入力すればよいのでしょうか、入力した日付の前後5日を自動的に増やす必要がある為に上記の仕様にしてます。

  • postgreSQLのupdateについて

    postgresqlのupdateについて質問です。 一つのテーブルで二つの列と任意の文字を別の列へ結合するupdate文を作りたいのですが初心者なものでわかりやすくご教授いただけたら幸いです。 UPDATE テーブル名 SET 列3 = '文字' || "列1" || '文字' || "列2" WHERE 列 Is Null; 何卒、よろしくお願い致します。

  • PostgreSQLのtimestamp型で時間(分)を抽出したい

    PostgreSQLのあるテーブルで「開始時刻」と「終了時刻」というフィールドがあり、timestamp with timezone(例:2008-07-31 07:00:00+09)でデータを持っています。 例えば、日付に関係なく13:00から15:00までのデータを抽出したい場合、SQLのWHERE句にはどのように記述すればよろしいのでしょうか?

  • PostgreSQLでのTimestamp列と数値列同士の演算での質問

    PostgreSQLでのTimestamp列と数値列同士の演算での質問です。 Timestamp型のField:Aと、数値型のField:Bを保持するテーブルにて、 AのB分後を求める時刻の演算方法を教えてください。 単純に Select A + B from hoge だと、1日後になり時刻の部分が失われてしまいます。 下記のテーブルに対して発行すると A         B --------------------------------------------------- 2010-01-01 09:00:00+09 1 2010-01-01 10:00:00+09 5 ?column? ------------ 2010-01-02 2010-01-06 が返ってきます。 分かる方がいましたら教えてください。 宜しくお願いいたします。

  • SQL文にて・・・

    質問があります。PostgreSQLです。 テーブル(test_tbl)があるとします。 テーブル構成は --------------------------- id ===== char(16) [英数文字格納] point ==== int2 add_date ==== timestamp --------------------------- このテーブルから idが2文字目から'di6ek68dh5ls7g'のレコードを取得したいと考えています。 レコード数がかなりおおいので パフォーマンスを重視したいのですが、 検索SQLがわかりません。 select * from test_tbl where id like '%di6ek68dh5ls7g'だとでると おもうのですが、 これ以上にパフォーマンスがあがる SQLがわかる方お願いいたします。

  • 日付範囲内かつ時刻も範囲内のデータをとるには?

    日付範囲内かつ時刻も範囲内のデータをとるには? 環境 postgreSQL7.4 date_tbl no | start_date | end_date ----------------------------------------------------- 1 | 2010-06-01 10:00:00 | 2010-06-03 15:00:00 例えば、上のような日付の範囲を設定するテーブルがあります。 現在の時刻が、date_tblで設定した範囲のデータを取得する条件式を記述するには どういう条件式を書けばいいでしょうか? 例えば、現在の時刻が下の範囲に該当する場合にnoを取得したい場合 2010-06-01の10:00:00~15:00:00 2010-06-02の10:00:00~15:00:00 2010-06-03の10:00:00~15:00:00

  • PostgreSQLのテーブル構造を取得したい

    現在PostgreSQLとPHP5を利用してアプリケーションを開発しております。 PHPにて現在すでに存在するPostgreSQLのテーブルの定義情報を取得するにはどうすればよろしいでしょうか。テーブルの定義情報は下記のようにSQLのCREATE文で取得したいと思っております。 CREATE TABLE favorite ( code serial NOT NULL, reg_date timestamp without time zone NOT NULL DEFAULT now(), update_date timestamp without time zone, title text, url text, u_id character varying(20) NOT NULL, enabled_flag smallint NOT NULL DEFAULT 1, CONSTRAINT web_favorite_pkey PRIMARY KEY (fv_code) ) 何卒よろしくお願いいたします。

  • Postgresql 日付 文字列比較

    現在Postgresqlの日付 文字列比較で困っています。 あるテーブルに更新日付を入力するカラムがあるのですが、 「SELECT * FROM test WHERE updatetime = '2013/07/26 12:07:13'」 というSQLを実行した場合、updatetimeが「2013/07/26 12:07:13」のデータが取得できません。 Create Castでキャストを作ってやる必要があるのでしょうか? もしくは別の方法がございましたらご教授をお願い致します。