2011-08-10 3 views
0

T-SQLを使用せずに月と月の月曜日を取得する方法はありますか?月の月の数を決定するためのSQLステートメント

おかげ

+1

あなたは "T-SQLを使用せず" によって何を意味するのか明確にすることはできますか? ANSI SQLのみを使用することを意味しますか? –

+1

これはSQL Serverに関する質問ですか? T-SQLを使用しない場合は、どのようなテクノロジを使用する予定ですか? –

+0

申し訳ありませんが、私はTSQLを使うことができると指摘しておきましたが、ただしたくありませんでした!私は既にSQL文(VB.Netから実行中)を持っていて、別の関数を書く必要なしに追加するだけでいいと思っていました。それは、私が関数を書いたり、Andrewが述べたように事前に生成されたテーブルを使用しなければならないように見える – cliffy

答えて

1
(DATEADD(DAY, -1, DATEADD( MONTH, 1 , month + '-01') - 
    DATEADD(DAY, 7 - DATEPART(WEEKDAY, month + '-01'), month + '-01') 
) DIV 7 + 1 

私はこれが(変更後、それは今SQL Serverで動作するはずではない)、それは、MySQLで動作 ですが、どのくらいのANSI SQL互換のか分かりません。

month私はあなたが言って何を意味するかわからないんだけど'yyyy-mm'形式

+2

あなたはT-SQLを使用しないことについての部分を釘付けにして:)。 –

+0

@MikaelErikssonここで唯一のT-SQLステートメントはDATEDIFF権利ですか?タイムスタンプに変換し、簡単なマイナス操作を行うことで、書き直すことができます。 – nobody

+0

@MikaelEriksson実際には、タイムスタンプに変換する必要はなく、マイナス演算でも同じ結果が得られます(更新されたコードを参照)。しかし、この動作がANSI SQLで保証されているかどうかはまだ分かりません。 – nobody

4

にする必要があります:

が与えられた月の月曜日の数(および 年)を取得する方法はありますT-SQLを使用しないでください?

すべてのデータベースでこれを行うユニバーサルコードフラグメントが必要な場合は、忘れてしまいます。私はあなたが2つの異なるデータベース上で動作するバージョンを手に入れることさえできるとは思っていません。平日のような日付やものは、データベースベンダーによって違った方法で実装される傾向があります。ここで

は、TSQLの道(月曜日月カウント)である:ここでは

;with AllDates AS 
(SELECT CONVERT(datetime,CONVERT(varchar(6),GETDATE(),112)+'01') AS DateOf 
UNION ALL 
SELECT DateOf+1 
FROM AllDates 
WHERE 
MONTH(DateOf+1)=MONTH(CONVERT(datetime,CONVERT(varchar(6),GETDATE(),112)+'01')) 
) 
SELECT COUNT(DateOf) AS MondayCountMonth 
FROM AllDates 
WHERE DATENAME(weekday,DateOf)='Monday' 

は、TSQLの道(月曜年カウント)である:OPのコメントに基づいて

;with AllDates AS 
(SELECT CONVERT(datetime,CONVERT(varchar(4),GETDATE(),112)+'0101') AS DateOf 
UNION ALL 
SELECT DateOf+1 
FROM AllDates 
WHERE 
YEAR(DateOf+1)=Year(CONVERT(datetime,CONVERT(varchar(4),GETDATE(),112)+'0101')) 
) 
SELECT COUNT(DateOf) AS MondayCountYear 
FROM AllDates 
WHERE DATENAME(weekday,DateOf)='Monday' 
OPTION (MAXRECURSION 367) 

EDIT、ここれます月別および月曜日の月曜日を別のクエリ内のサブクエリとしてカウントするバージョン:

DECLARE @YourTable table (Col1 int, Col2 varchar(5)) 
INSERT @YourTable VALUES (1,'aaa') 
INSERT @YourTable VALUES (2,'bbb') 
INSERT @YourTable VALUES (3,'ccc') 

;with MonthMondayCount AS 
(SELECT CONVERT(datetime,CONVERT(varchar(6),GETDATE(),112)+'01') AS DateOf 
UNION ALL 
SELECT DateOf+1 
FROM MonthMondayCount 
WHERE 
MONTH(DateOf+1)=MONTH(CONVERT(datetime,CONVERT(varchar(6),GETDATE(),112)+'01')) 
) 
,YearMondayCount AS 
(SELECT CONVERT(datetime,CONVERT(varchar(4),GETDATE(),112)+'0101') AS DateOf 
UNION ALL 
SELECT DateOf+1 
FROM YearMondayCount 
WHERE 
YEAR(DateOf+1)=Year(CONVERT(datetime,CONVERT(varchar(4),GETDATE(),112)+'0101')) 
) 
SELECT 
    y.* 
    ,(SELECT COUNT(DateOf) AS MondayCountMonth FROM MonthMondayCount WHERE DATENAME(weekday,DateOf)='Monday') AS MondayCountMonth 
    ,(SELECT COUNT(DateOf) AS MondayCountYear FROM YearMondayCount WHERE DATENAME(weekday,DateOf)='Monday') AS MondayCountYear 
    FROM @YourTable y 
    OPTION (MAXRECURSION 367) 

OUTPUT:

Col1  Col2 MondayCountMonth MondayCountYear 
----------- ----- ---------------- --------------- 
1   aaa 5    52 
2   bbb 5    52 
3   ccc 5    52 

(3 row(s) affected) 
+0

私が意味していたのは、既にVBから書かれたSQL文が書かれていたからです。月曜日にサブクエリを追加するだけでいいのですが。そして、私がMS SQL Server 2005を使用していると言えば、それは役に立ちました! – cliffy

1

はこれを試してみてください。)

DECLARE @tmpDate as date 
set @tmpDate = getdate(); --you can add any date 
DECLARE @Startdate as varchar(8) 
DECLARE @Enddate as varchar(8) 
SELECT @Startdate = replace(convert(varchar,cast(DATEADD(month, DATEDIFF(month, 0, @tmpDate), 0) as date) , 111), '/', ''); 
SELECT @Enddate = replace(convert(varchar, cast(DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@tmpDate)+1,0)) as date), 111), '/', ''); 

with [dates] as (
    select convert(date , @Startdate ) as [date] --start 
    union all 
    select dateadd(day , 1 , [date]) 
    from [dates] 
    where [date] < @Enddate) 
Select X.WeekDayNumber, count(X.WeekDayNumber) as NumberOfDays 
from (
SELECT [date] , DATEPART(weekday,[date]) as WeekDayNumber 
from [dates] 
WHERE [date] IS NOT NULL)X 
Group by X.WeekDayNumber 
option (maxrecursion 0) 
関連する問題