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

解決済みの質問

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を使った方法がわかりませ
ん。

どうか、御教示下さる様宜しくお願いいたします。

投稿日時 - 2007-05-24 15:48:51

QNo.3026681

困ってます

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

表の構成列、データ型、格納データ、得たい結果を示せば、回答が得られやすいと思います。

「tbl出席簿」表の「日付」列は、SQL Serverではdatetime型でいいのですね?

<SQL例>
select 名前,日付,一箇月前
from
(select 名前,日付,
substring(convert(varchar(10),dateadd(month,-1,getdate()),101),7,4)
+'/'+substring(convert(varchar(10),dateadd(month,-1,getdate()),101),1,5)
as 一箇月前
from tbl出席簿) as x
where 日付=一箇月前
;

<注意事項>
(1)「select ~ from (select ~ from ~) as 別名」はインラインビューであり、SQL Server 2005以降でないと実行できないと記憶しています。今回は、「1ヶ月前の日付」の条件を簡単に指定したいがためにインラインビューを使っています。

(2)「1ヵ月前」という名前は構文エラーになってしまったため、「一箇月前」と変更しています。

投稿日時 - 2007-05-24 23:42:46

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

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

回答(3)

ANo.3

>as 一箇月前の表示をしないようにするためには
>どうしたらいいか

「名前」列と「日付」列だけ表示したいということでしょうか?

もしそうなら、、、以下のように変更してください。

<SQL例>
select 名前,日付
from tbl出席簿
where substring(convert(varchar(10),日付,101),7,4)
+'/'
+substring(convert(varchar(10),日付,101),1,5)
=substring(convert(varchar(10),dateadd(month,-1,getdate()),101),7,4)
+'/'
+substring(convert(varchar(10),dateadd(month,-1,getdate()),101),1,5)

<簡単な説明>
(1)convert(varchar(10),日付,101)
→101は、日付データの書式を示し、mm/dd/yyyyの形式で返すように指定しています。
(2)substringでは、(1)のmm/dd/yyyyの形式から、yyyyを前に持って行き、'/'と(1)の残りのmm/ddを文字連結した結果を返すように指定しています。

参考URL:http://msdn2.microsoft.com/ja-jp/library/ms187928.aspx

投稿日時 - 2007-05-25 16:43:55

お礼

chukenkenkou様

度重なるご回答、心より厚く厚くお礼申し上げます。
誠にありがとうございました。
お礼の言葉もございません。

ANo.3で希望するデータを抽出することが出来ました!!!

今後とも宜しくお願い申し上げます。

58歳(男)より

投稿日時 - 2007-05-25 17:19:54

ANo.2

#1回答者です。

「日付」列には、時刻も入っていますか?
#1のSQLでは、時刻が入っていない場合のSQLになっていました。

日時が入っている場合にも検索できるSQLを、改めて提示します。

日付の書式は、yyyy/mm/ddである必要はどの程度でしょうか?
もし、yyyy-mm-ddでもよいなら、SQLが少し簡単になります。

(1)yyyy-mm-ddでもよい場合
-- yyyy-mm-dd
select
名前,日付,
convert(varchar(10),dateadd(month,-1,getdate()),120) as 一箇月前
from tbl出席簿
where convert(varchar(10),日付,120)
=convert(varchar(10),dateadd(month,-1,getdate()),120)

(2)yyyy/mm/ddである必要のある場合
-- yyyy/mm/dd
select
名前,日付,
substring(convert(varchar(10),dateadd(month,-1,getdate()),101),7,4)
+'/'
+substring(convert(varchar(10),dateadd(month,-1,getdate()),101),1,5)
as 一箇月前
from tbl出席簿
where substring(convert(varchar(10),日付,101),7,4)
+'/'
+substring(convert(varchar(10),日付,101),1,5)
=substring(convert(varchar(10),dateadd(month,-1,getdate()),101),7,4)
+'/'
+substring(convert(varchar(10),dateadd(month,-1,getdate()),101),1,5)

投稿日時 - 2007-05-25 07:19:23

お礼

chukenkenkou様

二度にわたるご回答ありがとうございます。
心より厚くお礼申し上げます。

ただ今、ANo.2の(2)yyyy/mm/dd形式で確認しましたところ
見事に抽出してくれました。
ありがとうございました。

ところでas 一箇月前の表示をしないようにするためには
どうしたらいいか、再度御教示いただけないでしょうか。
はなはだ勝手なお願いで誠に申し訳ございませんが
重ね重ね宜しくお願い申し上げます。

なお、データ型について御連絡しておきます。
名前…nvarchar(30)
日付…datetime

以上

投稿日時 - 2007-05-25 12:28:31