2011-08-10 41 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 

我不知道有多少ANSI SQL兼容這只是 它工作在MySQL (不是更改後,應該在SQL Server現在的工作)。

month應在'yyyy-mm'格式

+2

所述您已經確定了有關不使用T-SQL的部分:)。 –

+0

@MikaelEriksson這裏唯一的T-SQL語句是DATEDIFF嗎?我們可以通過轉換爲時間戳並進行簡單的減號操作來重寫。 – nobody

+0

@MikaelEriksson其實我甚至沒有必要轉換爲時間戳,只是減號操作給出了相同的結果(請參閱更新的代碼),但我仍然不確定在ANSI SQL中是否保證了此行爲。 – nobody

4

我不知道你的意思是說:

有沒有辦法讓週一在給定的月份( 一年)的數量而不使用T-SQL?

如果您希望能夠跨所有數據庫執行此操作的通用代碼片段,請將其忽略。我懷疑你甚至可以在兩個不同的數據庫上運行一個版本。像工作日這樣的日期和事情往往會在數據庫供應商中以不同方式實施。

這裏是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) 

編輯,這裏是在另一個查詢中查找每月和每年的星期一計數作爲子查詢的版本:

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

我的意思是我已經有了SQL語句(從VB運行),所以如果我可以只添加子查詢來獲得星期一,那就太棒了。是的,如果我提到我正在使用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) 
相關問題