ODBC SQLサーバーで前月の月初第一金曜日に当たる日付を出力するSQL

このQ&Aのポイント
  • ODBC SQLサーバーで前月の月初第一金曜日に当たる日付を出力するSQLについて質問します。現在のSQLは複雑でわかりにくいため、もっと簡単な方法があるか教えてください。
  • このSQLは先輩が作成したもので、日付を8桁で出力する必要があります。どのように改良するべきかアドバイスをいただけますか。
  • 質問内容は、ODBC SQLサーバーを使用して前月の月初第一金曜日に当たる日付を出力する方法についてです。SQLが複雑で理解しにくいため、もっとシンプルな方法があるか教えていただけると助かります。
回答を見る
  • ベストアンサー

ODBC SQLサーバーでSQLを実行したい・・・

ODBC SQLサーバーでSQLを実行したい・・・ 昨日から入り浸っている初心者PGです。 昨日は、実行日から直近の金曜日の日付を抽出するというSQLを質問させて頂きました。 今回は前月の月初第一金曜日に当たる日付を出力するSQLについての質問となります。 下記のSQLは先輩が作成したSQLになります。 もっと簡単に書けないか悩んでいます。 補足として日付は8桁で出力をしたいです。(例:20100507) 宜しければご教授賜りたいです。(原文そのままコピーしてますw) /* いけてるsql */ SELECT case (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime)))) when '-1' then datename(year,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + 6) + datename(month,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + 6) + RIGHT('00'+CONVERT(varchar,datename(day,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + 6) ),2) else datename(year,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime))))) + datename(month,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime))))) + RIGHT('00'+CONVERT(varchar,datename(day,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime))))) ),2) end

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

サンプルのSQL文がいけてるかどうかのコメントは差し控えます。 SELECT CONVERT(varchar, CASE WHEN DATEPART(dw,DATEADD(d,DAY(DATEADD(m,-1,GETDATE()))*-1,DATEADD(m,-1,GETDATE())))>=6 THEN DATEADD(d,13-DATEPART(dw,DATEADD(d,DAY(DATEADD(m,-1,GETDATE()))*-1,DATEADD(m,-1,GETDATE()))), DATEADD(d,DAY(DATEADD(m,-1,GETDATE()))*-1,DATEADD(m,-1,GETDATE()))) ELSE DATEADD(d,6-DATEPART(dw,DATEADD(d,DAY(DATEADD(m,-1,GETDATE()))*-1,DATEADD(m,-1,GETDATE()))), DATEADD(d,DAY(DATEADD(m,-1,GETDATE()))*-1,DATEADD(m,-1,GETDATE()))) END,112) 一発で出したいニーズはあるのでしょうが、同じことを何度も書くことになるので、以下はご参考までに。 やっているのは同じことです(前々月末日を求めて、それより後の最初の金曜日を算出) DECLARE @NOW datetime DECLARE @PREVEOM datetime DECLARE @DP int SET @NOW=GETDATE() SET @PREVEOM=DATEADD(d,DAY(DATEADD(m,-1,@NOW))*-1,DATEADD(m,-1,@NOW)) SET @DP=DATEPART(dw,@PREVEOM) SELECT CONVERT(varchar, DATEADD(d,6-@DP+CASE WHEN @DP>=6 THEN 7 ELSE 0 END,@PREVEOM),112)

mariko0512
質問者

お礼

いけていないSQLは上記のいけているSQLに変更をしましたw 先輩とソースを読んで大変参考になりました。 ありがとうございます。

関連するQ&A

  • ODBC SQLサーバーでSQLを使いたい・・・

    ODBC SQLサーバーでSQLを使いたい・・・ SET NOCOUNT ON DECLARE @EDATE DATETIME DECLARE @CUNT INT SET @COUNT = 0 WHILE ( @I <> -7 ) BEGIN IF ( DATANAME( WEEKDAY, DATEADD( DD, -1, GETDATE()))) = "金曜" BREAK ELSE SELECT @CUNT = @CUNT + 1 END SET @EDATE = CONVERT( CHAR, CONVERT( VARCHAR, DATEADD(DD, @COUNT, GETDATE()), 112) SELECT @EDATE 実行日からさかのぼり、金曜日の日付を表示したいSQLを作成しています。 なぜか"金曜"がおかしいとエラーが出てしまいます。 どなたかわかる方いましたらご教授お願い致します。

  • SQLのビューについて

    SQLServer:2005 OS:XP こんにちは。お世話になっています。 SQLServerでビューを作成し、テーブル「a」の構成データにプラスして、前月の1日を入力させようとしています。 ビューの列に↓を入力すると CAST(YEAR(DATEADD(m, - 1, GETDATE())) AS varchar) + CAST(MONTH(DATEADD(m, - 1, GETDATE())) AS varchar) + CAST('1' AS varchar) 「200811」と出力されるのですが、このデータを日付型にするにはどのような関数を追加したらいいのでしょうか? アドバイスをお願いいたします。

  • MS-SQL datetime型から日付だけを抽出する方法

     datetime型に、2004/02/16 15:50:00 という値が入ったレコードがあると仮定します。  このデータから 2004/02/16 と日付のみを使用したい時、適当な関数がなく苦慮しています。  Accessでいう、DateValue という関数に相当するものがあれば都合がいいのですが。  今は、 cast(cast(year(YMDHNS) as varchar)+'/'+cast(month(YMDHNS) as varchar)+'/'+cast(day(YMDHNS) as varchar) as datetime) などとしています。(YMDHNS は項目名)  とても美しくないのですが、これしか方法ないのでしょうか。

  • ODBC SQL ServerでSQLを発行したいのですが・・・

    ODBC SQL ServerでSQLを発行したいのですが・・・ IDがそのまま表示されてしまっていたので、再度登録しなおしました>< ・実行SQL DECLARE @DATE DATETIME DECLARE @STARTDATE DATETIME SET @DATE = GETDATE() SET @STARTDATE = DATEADD(DAY,-7,@DATE) SELECT * FROM teble WHERE 配達開始日 >= @DATE AND 配達開始日 <= @STARTDATE 上記のようなSQLを発行しデータを取得したいのですが、実行結果に表示がされません。 どうしていいかわからず困っています。 頭のDECLARE文しか動いていないのではないんだろうかと思っています。 実行ツールはCommon SQL Envieron mentを使用しています。

  • SQL Server で 翌月10日を取得する

    SQL Server で 翌月10日を取得する方法を教えてください。 isnull(convert(char(10),dateadd(month,1,(dateadd(day,9,DATE))),111),'') as DATE ↑これだと、DATE(月末)の翌月の9日後で、翌月10日も可能なのですが、 当然ながら、DATEが月末とは限らないので。。。 常に10日を固定で表示するにはどうしたら、よいのでしょうか? よろしくお願いいたします。

  • T-SQL(SQL Server2000) 月数の差の求め方

    お世話になります。 T-SQL(SQL Server2000)で月数の差の求めたいのですが、良い方法がないでしょうか? 関数の中に"DATADIFF"というものがありますが、これだと↓ SET @l_day1 = CONVERT(DATETIME,'2008/10/31',120) SET @l_day2 = CONVERT(DATETIME,'2008/11/01',120) DATADIFF(MONTH,@l_day1,@l_day2) /* 結果 */ 1 "2008/10/31" と "2008/11/01" の24時間の差の場合でも、結果に月数のさは"1"と出てしまいます。 上記の改善方法、又は、月数の差を求めれるロジック等をご存知の方が居ましたらお知恵をお貸しください。 宜しくお願い致します。

  • sql serverのsqlについて

    windows7 64bit sql server 2012 expressをつかっています。 select YEAR("日付") as yere,MONTH("日付") as month,収支名,sum("金額")as kin from 収支 group by YEAR("日付"),MONTH("日付"),収支名 を実行して、 yere month 収支名 kin 2013 6 支出 13011 2013 6 収入 33500 2013 7 支出 20000 2013 7 収入 70000 と、なりましたが、同じ年、月の収支と支出を求める表を得るにはどうしたらよいでしょうか? yere month 差 2013 6 -24089 2013 7 50000 のような感じです。 (もとのテーブルはこれです) id 日付 収支名 項目 金額 1 2013-06-16 収入 給料 15000 2 2013-06-16 支出 ガス代 555 ...... 宜しくお願いします。

  • ストアドファンクションについて

    最近SQL sarvarの勉強を始めた初心者です。 今、参考書を読みながらストアドファンクションを勉強してるんですが、 create function dbo.Fn_aaaaa (@dat datetime) returns char(14) as begin return cast(datepart(yyyy, @dat) as char(4)) + '年' + cast(datepart(mm, @dat) as char(2)) + '月' + cast(datepart(mm, @dat) as char(2)) + '日' + end という例題にある「returns char(14)」とはどういう意味なのかがよくわかりません。正直、戻り値という概念をしっかりと理解していない部分があり困っています。 本当に初歩的でもしかしたらSQLに関係のない質問かもしれませんがよろしければお教えください。

  • mysqlで日付が比較できない・・・

    はじめまして 皆様の知恵を貸してください mysqlでの質問なのですが、 簡潔にいうと日付が比較できません。 どういうことをしたいのかというとsqlからwhere文で今の日付より大きいもデータを抽出するということです データベースの構造は id int型 endtime datetime型 で構成されています endtimeには既にいくつかのdatetime型の値が入っています 例えば 2012-12-14 09:18:00 のように入っています でGETDATE()関数を使って今現在の時刻より未来のものだけ抽出するために convert関数を使って一度varchar型に変換することで比較しようとしました 色々インターネットで調べた結果次のような文なのではないかと考えました select id,endtime from [データベース名] where CONVERT(VARCHAR,endtime,121)>=CONVERT(VARCHAR,getdate(),121); しかし実行ができません 比較する方法を教えて欲しいです

    • ベストアンサー
    • MySQL
  • oracleのsqlで日付判断

    テーブルに以下の以下の様に日付が登録されています。、 cal_year cal_month cal_day item1 item2 item3 ・・・・・・ : 2019 6 29 2019 6 30 2019 7 1 2019 7 2 ; 2019 7 10 2019 7 11 ; 2019 7 20 2019 7 21 : 2019 7 31 2019 8 1 2019 8 2 : 見ての通り、テーブルに登録されている日付が、年、月、日と各々で 登録されており、また、月と日には、ゼロ埋めされてない値となって います。 因みに、cal_year、cal_month、cal_dayの属性は、varchar2です。 以下のsqlで、日付指定で、システム日付より以降の日付のデータを 取得しようとしているのですが、上手く行きません。 select * from tableA where cal_year||cal_month||cal_day>to_char(sysdate,'FMYYYYMMDD') order by cal_year,to_number(cal_month),to_number(cal_day) ; 今日、2019/7/22でやると、「2019 7 3」以降が出力されます。 また、日付を直接指定するとエラーとなります。 select * from tableA where cal_year||cal_month||cal_day>to_char('2019722','FMYYYYMMDD') order by cal_year,to_number(cal_month),to_number(cal_day) ; 「SQL : ORA-01481: 数値書式モデルが無効です」となります。 何がいけないのでしょうか。 このような使い方はダメなのでしょうか。 それとも、使わない使い方をしているのでしょうか。 お願いいたします。