postgresのカレンダー作成方法

このQ&Aのポイント
  • postgresで、ある日付から前日までのカレンダーをテーブル作成せずに作成したい場合の方法についてわかりません。
  • オラクルでは特定の日付から前日までのカレンダーを作成する方法がありますが、postgresではどのように指定すればよいのかわかりません。
  • 良い方法があれば教えてください。
回答を見る
  • ベストアンサー

postgresのカレンダーについて

postgresで、ある日付から前日までのカレンダーをテーブル作成することなく、用意したいのですが、良い方法がわかりません。 どのようにすればよいのでしょうか? ■イメージ 2014/9/1から前日まで (2014/10/20に実行した場合) 2014/9/1 2014/9/2 2014/9/3 ・ ・ ・ 2014/10/19 オラクルでは以下のように指定できたのですが、postgresではどのように指定すればよいのかわかりませんでした。 select to_date ('20140901', 'YYYYMMDD') + ROWNUM - 1 date1 from ALL_CATALOG where to_date ('201400901', 'YYYYMMDD') + ROWNUM - 1 <= sysdate - 1 order by 1

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

8.0系でも数値を返す generate_series は使えるようですので、連番を生成して開始日に足すようにすれば良さそうです。 SELECT '2014-09-01'::DATE + num FROM generate_series(0, CURRENT_DATE - '2014-09-01' - 1) AS tmp(num); 蛇足ですが、8.0.2がリリースされたのは9年半も前ですし、その後、セキュリティアップデートも何度も出ていますので、もっと新しいバージョンを使われた方が良いと思いますよ。

参考URL:
http://www.postgresql.jp/document/8.0/html/functions-srf.html
kashiwanoy
質問者

お礼

ご連絡遅くなり、申し訳ございません。 教えて頂いた方法で日付が作成出来ました! 大変助かりました。 本当にありがとうございます。

その他の回答 (1)

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

generate_series を使うのが簡単かと。 SELECT generate_series('2014-09-01', CURRENT_DATE - 1, '1 day')::DATE; ver 8.4 以降なら使えるはずです。

参考URL:
http://www.postgresql.jp/document/9.3/html/functions-srf.html
kashiwanoy
質問者

補足

早速のご回答ありがとうございます。 大変申し訳ございません、情報が不足しておりました。 確認したところ、version PostgreSQL 8.0.2でした。 このバージョンではエラーとなってしまうようです。 ERROR: 42883: function generate_series("unknown", date, "unknown") does not exist 他に方法はありますでしょうか?

関連するQ&A

  • oracle9i 日付データに関して

    お世話になっております。 Oracle9i(9.0.1.0.1) Linux RedHat7.3J JDBC 接続でOracle Type4 ドライバを使用しています。 本日の日付は2003/09/10で、sysdateも2003/09/10です。 この環境で、以下のSQL文を発行すると、 0件が返ってきます。 select count(*) from dual where '20030910' >= sysdate 以下の条件だと1件返ってきます。 select count(*) from dual where '20030911' >= sysdate さらに、sysdateにフォーマットを指定すると select count(*) from dual where '20030910' >= to_char(sysdate,'yyyymmdd') 1件返ってきます。 質問は、sysdateにto_charのフォーマットを指定した場合と 指定しなかった場合との違いについて教えていただきたいのと、 その違いが明文化されているサイトやotnドキュメントが ありましたら教えていただきたいのです。 otnドキュメントの日付データのところを読んだのですが 詳しい事はわかりませんでした。 宜しくお願いいたします。

  • Oracle データベース SQL

    質問させてください。 SQLについて教えてください。 SELECT文を作っていて、WHERE句で データを追加した日の指定(INSERT_DATE)を本日、というのをしたいと思っているのですが、なかなかできません。 格納するデータ型は、CHAR型なので WHERE INSERT_DATE =  TO_CHAR(SYSDATE, 'YYYYMMDD') で、試したのですができません…。 SQL実行はするのですが、該当なしになります。 教えていただければ、助かります。

  • テーブルの行を増やしたい・・・。

    テーブルの行を増やし、 データを一年文作成したいのですが・・・。 CREATE TABLE CALENDAR_TBL( YYYYMMDD DATE NOT NULL, DayData NUMBER(3) NULL CONSTRAINT CALENDAR_TBL_PKEY PRIMARY KEY(YYYYMMDD)); このテーブルに、2005年のデータ365レコードを挿入したいのですが、 1つのINSERT文(SQL)で、できますでしょうか? (※PL/SQLは除きます。) ※不可能であれば、SELECT文(下記のように)を一年分用意してUNIONで作成するのですが、 これ以外に簡単にできないでしょうか? INSERT INTO CALENDAR_TBL ( (SELECT SYSDATE + 000, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 001, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 002, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 003, DayData FROM CALENDAR_TBL) ・・・(省略)・・・ UNION (SELECT SYSDATE + 365, DayData FROM CALENDAR_TBL) )

  • oracle SQL

    売上情報を日別に集計して抽出しようと考えております。 その際に売上が存在しない日のレコードも纏めて抽出したいと考えております。 以下のように日付一覧を副問合せで生成し、left joinすれば良いかと 考えたのですが、結果は売上が存在するレコードしか抽出されません。 下記のSQLでは何が原因で全日付が抽出されないのか分る方がいらっしゃいましたらご教授頂けますと幸いです。 select 売明.商品コード, 売伝.納品日, 月日.全日, -- TO_CHAR(売伝.納品日,'DY') AS 曜日, TO_CHAR(月日.全日,'DD') AS 日, TO_CHAR(月日.全日,'DY') AS 曜日 -- count(売明.商品コード) AS 売上回数 from 売上伝票データ 売伝, 売上明細データ 売明, ( SELECT TO_DATE('20180401', 'YYYYMMDD') + ROWNUM - 1 AS 全日 FROM ALL_CATALOG WHERE TO_DATE('20180401', 'YYYYMMDD') + ROWNUM - 1 <= TO_DATE('20180430', 'YYYYMMDD') ORDER BY 1 ) 月日 where 売伝.納品日 BETWEEN TO_DATE('20180401','YYYY/MM/DD') AND TO_DATE('20180430','YYYY/MM/DD') AND 月日.全日 = 売伝.納品日(+) AND 売伝.売上伝票番号 = 売明.売上伝票番号 AND 売明.商品コード = '009405'

  • WHERE句でのデータ型について

    お願い致します。 ORACLEのWHERE句に対する疑問点ですが、 カレンダを管理するテーブル(カレンダマスタ)において、条件を指定してデータをSELECTする時にWHERE句に記入するデータ型についてご指導お願いします。 <詳細> 目的としてカレンダマスタよりSYSDATEの年月の休みの日を除く、稼動日数(COUNT)を求めるのが、目的です。 自分で作成した、SQLでは目的を果たしているのですが、WHERE句にTO_CHARを使用し、抽出項目(年月日-DATE型)を指定しているのですが、条件を指定する時は、TO_CHARで指定しても問題は無いのでしょうか? <SQL> SELECT COUNT(TO_NUMBER(休みFLG)) AS 稼動日 FROM カレンダマスタ WHERE 年月日 BETWEEN (TO_DATE(LAST_DAY(ADD_MONTHS(SYSDATE,-1))+1,'YYYY/MM/DD')) AND (TO_CHAR(LAST_DAY(SYSDATE),'YYYY/MM/DD')) AND 休みFLG='0' <補足> 休みFLG='0'は稼動日

  • ROW_NUMBER()を使用したデータ取得

    ROW_NUMBER()を使用してORDERした結果の5行目から10行目を 取得したい場合、どこのサイトを参照しても下記(1)のように NOで並び替えたデータをインラインビューとして WHERE RNUM BETWEEN 5 AND 10 と条件を絞っていますが、(2)のように直接条件を指定した場合と どのような違いがあるのか教えてください。 (1) SELECT NO, NAME FROM ( SELECT NO, NAME, ROW_NUMBER() OVER (ORDER BY NO) RNUM FROM ROWNUM_TEST ) WHERE RNUM BETWEEN 5 AND 10 (2) SELECT NO, NAME,ROW_NUMBER() OVER (ORDER BY NO) RNUM FROM ROWNUM_TEST WHERE RNUM BETWEEN 5 AND 10

  • OracleSqlで『RORNUM』の使い方について

    VB6でコーディングをしています DBはOracle7.3です SELECT A.One, A.Two, SUM(A.Three) Three,  FROM A  WHERE ( A.One = '001' AND A.Two = '3')  GROUP BY A.One, A.Two ORDER BY Three DESC  上記のようにAテーブルの項目One,Two,Threeを抽出するSQLで 重複項目One,Twoでグループ化したThreeの合計値の内、上位25件を 取得したいのですが... SELECT *  FROM ( SELECT A.One, A.Two, SUM(A.Three) Three,  FROM A  WHERE ( A.One = '001' AND A.Two = '3')  GROUP BY A.One, A.Two ORDER BY Three DESC ) WHERE ROWNUM <= 25 上記のように記述するとORDER BY句でエラーになります ORDER BY句をWHERE ROWNUMの下に記述するとSQLはとおりますが 条件が変わってしまいます。 抽出条件でマージ、降順ソートしたものに対して上位n件の取得をするには どうすれば良いのでしょうか?

  • TO_DATEの使い方を教えて下さい

    Oracleを習い始めたばかりで、とても初歩的な質問ですみません。 customer_numberが124でorder_dateが09/05/98のレコードをSELECTしたいのですが、 TO_DATEを使うとうまくいきません。 その条件に合うレコードは存在して、日付をデフォルトの形で書くとSELECTできます。 TO_DATEの使い方を間違えているのでしょうか。 よろしくお願いします。 SQL> select order_number 2 from orders 3 where customer_number='124' and order_date='05-SEP-98'; ORDER ----- 12500 SQL> select order_number 2 from orders 3 where customer_number='124' and order_date=to_date('09/05/98','MM/DD/YY'); no rows selected

  • 最近の20件を取得するSQL

     現在PostgreSQL上にあるDBをOracleに移行しようとしていますが、Oracleに詳しくないためご教示いただきたく存じます。  2000万行ほどの売り上げテーブルがあります。  そこである商品やジャンルで絞り込みをおこない(または全く絞り込みをせず)最近20件を検索したいと思っています。(正確に言うと、次ページ、前ページなどでその前後を取得する機能も必要です。)  で、この最近の20件、というところで躓いています。  いろいろと検索してみると select * from ( select 検索項目... from sold where 絞り込み条件 order by sold_date desc ) where rownum<20; なんていう例が載っていたりするのですが、これだと絞り込みがない場合に内側のselect文で2000万件なめてしまうので論外です。(試しにやってみたら30秒くらいかかりました)  別段レアなケースでもなく、こういう要件はとても一般的だと思うのですが、Oracleではどのように実装するのが一般的なのでしょうか。  よろしくお願いいたします。

  • もうちょっと賢いSELECT文が書けないものでしょうか

    初めまして、最近SQLをかじり始めたぺーぺーです。 効率の悪いSELECT文しか書けずに困っています。 下記のテーブルsoftware_tableから、 ・name列「oracle」 ・version値が最大 のレコードに含まれるid(=3)を拾ってきたいのですが、自分の頭では副問い合わせを使う方法か、ソートを使う方法しか思いつきません。 問題は副問い合わせ・ソートを使うと計算コストが大きくなってしまうことで、できることなら副問い合わせ・ソートを使わずに解決したいのですが、何か方法はないものでしょうか? よろしくお願い致します。 ----------------------------- software_table id name version 1 oracle 1 2 oracle 2 3 oracle 3 4 postgres 1 5 postgres 2 6 postgres 3 7 postgres 4 ----------------------------- ■副問い合わせを使った方法 SELECT id FROM software_table WHERE name = 'oracle' AND version = (SELECT max(version) FROM software_table WHERE name = 'oracle'); ■ソートを使った例 SELECT id FROM software_table WHERE name = 'oracle' ORDER BY version DESC LIMIT 1 OFFSET 0; -----------------------------