• ベストアンサー

Nヶ月前の1日を取得したいのですが

今回はじめてvb6のプログラムを作成します。 処理概要は、access2000のテーブルからNヶ月前の1日以降の日付を持つデータを抽出するです。 この場合に、日付の算出はどのような記述になるのでしょうか? 算出のロジックはsqlの中に記述せずに、別エリアに編集してテーブルの項目Aと>=で比較したいのですが。 なお、テーブルの項目のデータ型はcharです。 お手数ですが、よろしくお願いします。

  • kiyoto
  • お礼率79% (163/205)

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

Sub test()   Dim strDmyDate As String      Dim intYear   As Integer   Dim intMonth  As Integer   Dim intBeforMonth  As Integer      Dim datDate   As String   Dim strDate   As String      'ダミーデータ   strDmyDate = "20020107"      '何ヶ月前?   intBeforMonth = 6 'この場合6ヶ月前      '年月を抽出   intYear = Left(strDmyDate, 4)   intMonth = Mid(strDmyDate, 5, 2)      'Nヶ月前の一日を、日付型で算出   datDate = DateSerial(intYear, intMonth - intBeforMonth, 1)      'フォーマット変換   strDate = Format(datDate, "yyyymmdd") End Sub 見せてもらったデータからすると、strDateの値をSQL文にそのまま使用できます。 ただ、文字列なので "select * from テーブル where 項目A >= '" & strDate &"'" といったように シングルコーテーションを忘れないようにしてください。

kiyoto
質問者

お礼

回答ありがとうございました。 おかげさまで解決いたしました。

その他の回答 (1)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

charとありますので、データの無いよう次第でアドバイスが変わるとおもいます。 どんなデータが入っているのでしょう? (1)20020107 (2)020107 (3)2002/01/07 これ意外にも様々な格納法則が考えられます。 現在のデータを一部公開してください。

kiyoto
質問者

補足

説明不足で申し訳ありませんでした。 補足します。 データの内容は、20020107と設定されています。 基準日がが20011213の場合、2001601を算出します。 今回の処理で、基準日はシステム日付を使用します。

関連するQ&A

  • 1週間後の日付を求めたい

    テーブルにchar(6)でyymmdd形式の日付を格納する領域を作成しております。この格納された日付から1週間以上過ぎたもののみ抽出したいのですが、sqlの構文を上手く作成できず大変こまっております。 有識者様大変お手数ですがご教授を頂けないでしょうか?

  • SQLの構文で質問です。

    いつもお世話になっております。 SQLの構文で質問です。 テーブルを開いて、データの中から日付を絞って抽出したいのですが、 whereの後にどのような記述をすればいいのかわかりません。 なんとなく『>』を使ってやってみましたがうまく抽出できませんでした。 例えば、2008/12/01~2008/12/31の絞りで抽出できるようにしたいのですが。 SELECT * FROM 日付 WHERE (日付   2008 / 12 / 01    2008 / 12 / 31) すみません、SQLを使い始めて間もなく本を見てはいるのですがうまくいかないもので。 宜しくお願いします。

  • データベースの検索について

    ORACLE8.0.5において 日付を管理するテーブル(Work)において <構成>  workday char(08) not null (key) work7day char(01) workym char(06) 上記の構成のテーブルにおいて 指定日付(例:20020125)から、5レコード目の データを抽出するときの、SQLの組み方を教えてください。 PLSQLを使用して、上記のDBをアクセスし、5レコード目 (レコードが持っている営業日)を抽出しようとしています。よろしくお願いします。

  • 月間集計ですべての日付を抽出するには

    Oracle9iで開発をしております。 月間集計をするにあたり、SQLをどのように書けばよいのか質問させていただきたいと思います。 たとえば、COUNTテーブルというテーブルがあり 年月日 カウント数 2005/09/01 1000 2005/09/01 1000 2005/09/02 2000 2005/09/03 3000 2005/09/05 5000 2005/09/06 6000 というようにデータが入っていたとします。 現在、 SELECT 年月日, SUM(カウント数) FROM COUNTテーブル WHERE COUNT_DATE BETWEEN TO_DATE(to_char(?||'/'||?||'/01')) AND LAST_DAY(TO_DATE(to_char(?||'/'||?||'/01'))) GROUP BY 年月日 としていまして、抽出されるデータは 2005/09/01 2000 2005/09/02 2000 2005/09/03 3000 2005/09/05 5000 2005/09/06 6000 となります。 ここで、2004/09/04や2005/09/07以降2005/09/30までのテーブルには存在 しない日付も抽出したいと思っています。 どのようにすれば抽出できるのでしょうか?

  • 重複レコードの取得

    すみません。。重複レコードの取得方法に困っています。 やりたいのは以下です。 テーブルA 項目1| 項目2| 項目3| 11 | 11 | 01 | 12 | 11 | 02 | 13 | 11 | 04 | 14 | 11 | 04 | 上記の項目1は主キーです。 抽出したいのは下記のみです。 項目1| 項目2| 項目3| 13 | 11 | 04 | 14 | 11 | 04 | 色々SQLを組んで試しては見てるのですが。。。。 select * from テーブル where ((項目3) in (SELECT 項目3 FROM テーブル GROUP BY 項目3 having count(*)>1)) 上記SQLだと項目3を主キーごとにカウントしてるみたいなので 意図した結果が抽出されないのです・・・・・。 項目2と項目3を結合して重複のチェックをすればよいのか?? とも思いますがSQL自体が1本で完結したいので よく分からなくなってしまいました。。。。。 皆さんご教示宜しくお願い致します。

  • SQLでDATE型のデータを参照するのは?

    SQLであるテーブルから日付型のデータを秒単位まで参照したのですが... そうですね、例えば"TABLE01"というテーブルの"Field01"っていう項目から 2000年9月7日の11:45のデータを抽出したい場合は、どような SELECT文を発行すればよろしいのでしょうか? ちなみに自分がやっているのはORACLE7です。

  • 一日前のデータのみ表示

    SQL文についてご教授ください。 あるテーブルのいくつかの列をSELECTする際に、 timestampという列に対して、下記のようにしています。 to_char(timestamp, 'yy-mm-dd hh24:mi:ss') DAY そこで、質問です。 timestamp列が、一日前のデータのみ抽出するには、どのように記述すればよいのでか。 timestamp列は、data型です。 DBはOracle10gです。 OSはWindowsServer2003です。 宜しくお願いいたします。

  • データ型について教えてください。

    データ型について教えてください。 あまり気にする必要がないかもしれませんが、テーブルにフラグ目的でフィールドを作る場合、 データ型は何するのが一般的なのでしょうか?(CHAR OR NUMBER?) ACCESSで言えばBOOLEANになると思うのですが、ORACLEやポスグレはないですよね? 私は、CHAR(1)にしています。 理由は、プログラムでSQLを書くときに''で囲むようにするためです。 その他のフィールドもだいたいテキストか日付ですので、''を囲むフィールドばかりです。 できるだけ''囲むフィールドに統一して、SQLの記述ミスを少なくしようというのが狙いです。 この考え方は間違っていますか?

  • オラクルのレコードカウントの制御

    プログラム初心者です。 オラクル(11g)で、10個のPCで10人が、あるテーブルのデータを更新していく、システムを作成(VB2005)しています。 例として下記のようなデータがあります。 テーブルC 日付順 番号はユニーク 日付_番号_レコードカウント(Rc) 1/3____1_____0 1/5____2_____1 1/6____5_____2 (Rc2) 1/7____7_____3 (Rc3) 1/20__ 9_____4 2/1___10_____5 この全データをSQLで、【【毎回】】読込みます。 A氏が例えば1/6のデータを編集したとします。レコードカウント2(以降Rc2) 【編集したデータは、同テーブルが更新される場合と、他のテーブルに移動するケースがあります。 更新された場合でも、他のテーブルに移動する場合でも、A氏は次に1/7(Rc3)のデータを編集させたいです。】 この場合、更新されたら、レコードカウントを次に移行すればいいのですが(Rc2+1で Rc3)、 1/6のデータを編集後、他のテーブルに移動された場合、Rc3を見ても(SQL再読込後)、1/20のデータが抽出されて しまいます。 なので、このケースは、テーブルが移動された場合、レコードカウントは据え置きで、Rc2をみるという プログラムを作らなくてはいけません・・・・・。 これも問題ですが、さらに大きな問題は、 1/6のデータを編集後、そのデータが移動されたときに、その間にB氏とC氏により、1/3,1/5のデータ更新後移動 されたケースがさらに悩んでいます。 Rc2で据え置きで 1/7のデータを読みに行こうとしたら、1/3,1/5のデータが既になくなっているので、 Rc2をみると、2/1のデータを見ることになってしまいます。 こうした多くの人がデータを編集、移動する場合のテーブルを、日付順に作業させていく場合は、どのような制御 (またはオラクルの機能)をすれば、可能なのかご指導頂ければ助かります。

  • オラクルのレコードカウントの制御(改訂版)

    プログラム初心者です。 オラクル(11g)で、10個のPCで10人が、あるテーブルのデータを更新していく、システムを作成(VB2005)しています。 画面は2パターンです。 ・データ一覧表示画面 ・上記からデータを選択し、編集する用の画面 例として下記のようなデータがあります。 テーブルC 日付順 番号はユニーク 日付_番号_ステータス__レコードカウント(Rc) 1/3____1_____Q________0 1/5____2_____R________1 1/6____5_____G________2 (Rc=2) 1/7____7_____P________3 (Rc=3) 1/20__ 9_____R________4 2/1___10_____U________5 動作の流れ 1.まず、この全データをSQLで読込みます。 SELECT * FROM テーブルC ORDER BY 日付 ASC これが一覧表示画面(VB2005のグリッドビュー等)に表示されます。 2.A氏が例えば1/6のレコードを編集したいとします。 そこで、1/6(日付)の列をマウスで選択。このとき列番号(レコードカウント)は2になります。 編集画面フォームに、同じSQL(SELECT * FROM テーブルC ORDER BY 日付 ASC) と、列番号(レコードカウント)2を、引渡しします。 3.編集画面で、引き渡されたSQLを実行し、そのデータを全てDatatblに格納します。 そのデータの3つめ(レコードカウント2)を参照します。 datatabl.Rows(2).Item("ステータス") データは参照後、ある条件によりステータスが変わります。 ステータスが、"Z"になった場合、そのレコードは、テーブルAに移動されます。 4.編集後は、他のテーブルに移動する場合でも、テーブルCがそのまま更新される場合でも、 自動的に次の列のレコードに移行し編集を行う。 今回は例として、1/6のレコードのステータスが"Z"になって A氏は次に1/7(Rc3)のデータを編集作業に入ります。 5. 4.を実行するため、また同じSQLを実行。 SQL実行後、レコードカウントを次に移行すればいいのですが(Rc=2に1を加え、Rc=3とする)、 Rc=3を見ても、1/20のデータが抽出されて しまいます。 (1/6のレコードが移動してなくなってしまった場合) また、他の例として、上記と同様に、A氏が1/6のデータを編集中に、他の人が1/3,1/5のデータを編集移動 してしまった場合、レコードカウントがぐちゃぐちゃになってしまいます。 こうした多くの人がデータを編集、更新・移動する場合のテーブルを、日付順に作業させていく場合は、どのような制御 (またはオラクルの機能)をすれば、可能なのかご指導頂ければ助かります。

専門家に質問してみよう