• ベストアンサー

先期末日の日付を求めるSQL

MySQL5.0 について、 先期末の日付をYYYY-MM-DDの形で求めるSQLを作成したいと考えております。 【要件】実行時のシステム日付から先期末(上期/4~9月、下期/10~3月)の日付を返す 【例】       [実行日]          [結果]      2008/06/10   →    2008/03/31      2008/12/24   →    2008/09/30 MySQLについては全くの無知であり、日付の関数から調べている始末です。 どなたか既に同様のSQLを実行経験のある方、実行SQLをご教示願います。 こうすれば出来るんじゃないか?という意見でも結構です。 宜しくお願い致します。

  • MySQL
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

今、テーブルdatesのカラムdがDATE型とします。 SELECT d, QUARTER(d), CASE             WHEN QUARTER(d) = 1 THEN CAST(CONCAT(YEAR(d) - 1, '-9-30') AS DATE)             WHEN QUARTER(d) IN (2,3) THEN CAST(CONCAT(YEAR(d), '-3-31') AS DATE)             WHEN QUARTER(d) = 4 THEN CAST(CONCAT(YEAR(d), '-9-30') AS DATE)            END endOfHalfPeriod  FROM dates; これで、でると思います。

noa104
質問者

お礼

回答ありがとうございます。 QUARTER(d)!これです。こんな関数があればと思っていました。 確かにいただいたSQLでいけそうです。 ご回答、誠にありがとう御座いました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

1-3月、4-9月、10-12月を分けて考えればよいのでは? たとえばこんな感じ? SELECT @D:='2008/02/01' AS `日付` ,IF(MONTH(@D) BETWEEN 4 AND 9 ,CONCAT(YEAR(@D),'/03/31') ,CONCAT(YEAR(@D)-(MONTH(@D)<4),'/09/30') ) AS `期末`; SELECT @D:='2008/06/01' AS `日付` ,IF(MONTH(@D) BETWEEN 4 AND 9 ,CONCAT(YEAR(@D),'/03/31') ,CONCAT(YEAR(@D)-(MONTH(@D)<4),'/09/30') ) AS `期末`; SELECT @D:='2008/12/01' AS `日付` ,IF(MONTH(@D) BETWEEN 4 AND 9 ,CONCAT(YEAR(@D),'/03/31') ,CONCAT(YEAR(@D)-(MONTH(@D)<4),'/09/30') ) AS `期末`;

noa104
質問者

お礼

回答ありがとうございます。 確かに1-3月、4-9月、10-12月の3パターン分けて考えるべきだと思います。もしも、ORACLEにないMySQLの関数で簡単に導けるのであればと思っていたのですが、やはり頂いた内容のロジックで考えるべきなのですね。 早々の回答ありがとう御座いました。

関連するQ&A

  • 日付型→文字列

    SQLServer2005の環境にて、 日付型の項目(YYYY/MM/DD HH:MM:SS)から日付のみを抽出したい場合、 現在SUBSTRING(CONVERT(VARCHAR,AA),1,10) と変換を行っているのですが、結果が「MM DD YYYY」となってしまいます。 「YYYY/MM/DD」の形式で取得するにはどのようなSQL文にすればよろしいのでしょうか。

  • 日付に関するSQL分で

    wonddows2000,Access2000 VBAで勤怠管理をしたいのですが日付に関するSQL分でDATEDIFFの使い方が今ひとつわかりません。 SELECT * ,DATEDIFF(day,入室日,退室日)  FROM TABLE WHERE 部署コード=700  WHERE後部分はどう表現したらいいでしょうか。 検査条件(1) 入室日(YYYY/MM/DD)=退室日(YYYY/MM/DD) 且つ入室時間(hh:mm:ss)が09:00:00より後且つ 入室日(YYYY/MM/DD)=退室日(YYYY/MM/DD)+1 且つ退室時間(hh:mm:ss)が09:00:00より前且つ 部署コードが700に対応するテーブルの全データを出力 検査条件(2)上記以外の全データ TABLE (文字型)  (文字型) (日付型) (日付型) (日付型) (日付型) 部署コード | 氏名  | 入室日  |入室時間 | 退室日  | 退室時間 | 1000 A 2000/12/01 8:16:30 2000/12/01 18:10:20 2000 B 2000/12/02 8:16:30 2000/12/03 8:10:20 700 C 2000/12/03 9:16:30 2000/12/03 18:10:20 3000 A 2000/12/04 8:16:30 2000/12/01 18:10:20 700 D 2000/12/04 8:16:30 2000/12/05 8:10:20 700 E 2000/12/04 8:16:30 2000/12/04 18:10:20 結果(1) 700 C 2000/12/03 9:16:30 2000/12/03 18:10:20 700 D 2000/12/04 8:16:30 2000/12/05 8:10:20 結果(2) 1000 A 2000/12/01 8:16:30 2000/12/01 18:10:20 2000 B 2000/12/02 8:16:30 2000/12/03 8:10:20 3000 A 2000/12/04 8:16:30 2000/12/01 18:10:20 700 E 2000/12/04 8:16:30 2000/12/04 18:10:20

  • 先期末の日付を求めるSQL

    先期末の日付を求めるSQLで、もっともイケてるのを教えてください。 期は 4月~9月、10月~3月で 2007年2月5日 なら先期末の日付は 2006年9月30日 です。

  • SQL Sever での日付の差の求め方(月単位小数付き)

    Oracle で日付の差を求める関数に「months_between」 というものがあり、日付A(yyyy-mm-dd)と 日付B(yyyy-mm-dd)の差(A<B の場合)を算出する時は、 select months_between(B ,A) from dual; で算出できます。 しかも、日付差が何ヶ月で返ってきて、月の端数は 小数点以下として返ります。 これを、SQL Server で実現しようとした場合、 どのようにすればよいでしょうか? SQL Server には「datediff」という関数があり、 時間単位を'm'に設定すれば日付差が月で返って きますが、小数点以下が確か切り捨てられたように 記憶しています。 何とかして、小数点以下も算出できる方法を ご存知の方がいらっしゃいましたら、 お教えください。 宜しくお願い致します。 以上

  • nvarcharとdatetimeで作成された日付の抽出方法について

    SQL Server 2005 EXPRESSを使って、 nvarchar型で作成されたyyyy/mm/ddの日付と datetime型で作成されたyyyy/mm/ddの日付を比較し WHERE '2007/05/04' > gettime()のようなSELECT文の WHERE句を使って該当レコードを表示することが可能であれば 教えてください。 以上、宜しくお願いします。

  • EXCEL 日付の入力形式

    こんにちは。 日付が、dd/mm/yyyyの形式で入力されたデータをもらいました。 関数を利用したいのでEXCELに日付として認識させたいのですが、 セルの書式設定で設定してもだめなようです。 質問 1)yyyy/mm/ddの形式で入力されていないと日付として認識されないのでしょうか? 2)現在の形式のまま、日付として認識させる方法はありますか? 3)dd/mm/yyyyをyyyy/mm/ddに変換する方法はありますか? 以上、よろしくお願いします。

  • SQL Server 2005 Expressを利用して1ヶ月前のデータを表示する方法について

    SQL Server 2005 Expressを使って、テーブル(tbl出席簿)に格納され たデータのうち、今日よりも1ヶ月前のデータを表示するSQL文を教え てください。 因みにAccessでは SELECT tbl出席簿.名前,tbl出席簿.日付,Format([日付],"yyyy/mm/dd") AS 1ヶ月前 FROM tbl出席簿 WHERE (((Format([日付],"yyyy/mm/dd"))=Format(DateAdd("m"-1,Date()),"yyyy/mm/dd"))); でOKなんですが、SQL Server 2005 Expressを使った方法がわかりませ ん。 どうか、御教示下さる様宜しくお願いいたします。

  • EXCELで日付を****年上期、****年下期で表現する関数

    EXCELで、例えば、A1セルに2005/02/23 というような形式で日付が入力されています。 会社では4月1日~9月30日までを上期、 10月1日~翌年3月31日までを下期としています。 2005/02/23は2004年下期 2004/08/15は2004年上期 2004/10/17は2004年下期 2005/04/01は2005年下期 と表現するような関数を教えてください。

  • Excel97の日付の書式設定

    現在Excel97で日付入力をしたいのですが、 最終的に演算に使用する日付で yyyy/mm/ddとyyyy/mmどちらでも入力できる書式設定を探しています。 yyyy/mm/ddの指定にするとyyyy/mmと入力してもyyyy/mm/01となってしまいます。 yyyy/mmのセルとdd専用のセルを別に作ると、ddを入力した時に 閏年のエラーチェックなどがかけられないので演算部分(1年後該当日前日の指定等)がうまく働きません。 いい方法がありましたら教えてください。

  • ACCESSの日付形式

    テーブルに日付形式のフィールドがあり、エクスポートすると、形式がyyyy/mm/dd hh:mm:ddになってしまいます。 yyyy/mm/dd形式でエクスポートするには、どのようにしたらよいでしょうか。 VBAのDocmd.TransferTextで行いたいと思います ちなみにAccess97です。 よろしくお願いします