こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2010-06-01 09:27:40

QNo.5936623

すぐに回答ほしいです

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

サンプルの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)

投稿日時 - 2010-06-01 10:56:01

お礼

いけていないSQLは上記のいけているSQLに変更をしましたw

先輩とソースを読んで大変参考になりました。
ありがとうございます。

投稿日時 - 2010-06-01 14:45:47

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問