2012-04-04 50 views

回答

5

下面的工作不管你考慮的第一天周(星期日,星期一等),只要確保你使用SET DATEFIRST如果你想改變默認值。 SET DATEFIRST 1將在星期一的第一天。

SELECT DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [WeekStart], 
     DATEADD(DAY, 7 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [WeekEnd] 

編輯

我剛剛重新閱讀您的要求,我想你可能是東西上面我所給出的不同了。如果你想第一個和最後一個月的一週中的一天,這個就可以了:

SELECT DATENAME(WEEKDAY, DATEADD(DAY, 1 - DATEPART(DAY, GETDATE()), GETDATE())) [FirstDayOfMonth], 
     DATENAME(WEEKDAY, DATEADD(DAY, - DATEPART(DAY, DATEADD(MONTH, 1, GETDATE())), DATEADD(MONTH, 1, GETDATE()))) [LastDayOfMonth] 
+0

謝謝你,先生。Gareth D,我明白了,我使用你的查詢並添加了一些更多的代碼,現在它將來到,謝謝你。 – 2012-04-05 06:46:47

6

要獲得一週的使用第一天:

select dateadd(wk, datediff(wk, 0, getdate()), 0) 

最後一天將是第一天+ 6:

select dateadd(wk, datediff(wk, 0, getdate()), 0) + 6 

警告:這是文化敏感。請檢查文檔@@datefirst

1

您的要求尚不清楚:您認爲哪一週是第一天和最後一天?週日和週六?星期一和星期五?星期一和星期天?但許多與日期相關的查詢的最佳解決方案是創建一個calendar table。這使您可以根據自己的定義輕鬆設置數週,數月和數年的第一天和最後幾天,如有必要,甚至可以採用多種格式。

如果您使用諸如財務年度,工作日等概念,其中定義因國家和公司而異,這一點尤其有用。當您的邏輯例外時,它也是最簡單的解決方案,例如一年中的第一週與「正常」一週有不同的規則。

隨着日曆表,你可以預填充一週的第一天和最後一天,然後你的查詢可以是這樣的:

-- first/last days stored as dates in their own columns 
select FirstDayOfThisWeek, LastDayOfThisWeek 
from dbo.Calendar 
where BaseDate = @SomeDate 

-- first/last days stored as bit flags 
select max(BaseDate) 
from dbo.Calendar 
where BaseDate <= @SomeDate and IsFirstDayOfWeek = 0x1 
0

在這裏,我給

周,月,季,半年,一年的開始和結束日期。

 Select CONVERT(varchar(50), GETDATE(),105) 'GETDATE' , 
     CONVERT(varchar(50), DATEADD(DAY, 2 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)),105) [WeekStart], 
CONVERT(varchar(50),DATEADD(DAY, 8 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) ,105)[WeekEnd], 
CONVERT(varchar(50),DATEADD(dd, -DAY(getdate()) + 1, getdate()),105) MonthStart, 
CONVERT(varchar(50),DATEADD(dd, -DAY(DATEADD(mm, 1, getdate())), DATEADD(mm, 1, getdate())),105) MonthStart, 
CONVERT(varchar(50), DATEADD(q, DATEDIFF(q, 0, GETDATE()), 0),105) AS 'QStart Date',  
CONVERT(varchar(50), DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, GETDATE()) + 1,0)),105) AS 'QEnd Date', 
CONVERT(varchar(50), CAST(CAST(((((MONTH(GETDATE()) - 1)/6) * 6) + 1) AS VARCHAR) + '-1-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS DATETIME),105) StartOfHalfYear, 
CONVERT(varchar(50), CAST(CAST(((((MONTH(GETDATE()) - 1)/6) * 6) + 6) AS VARCHAR) + '-1-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS DATETIME),105)EndOfHalfYear, 
CONVERT(varchar(50), DATEADD(yy, DATEDIFF(yy,0,getdate()), 0),105) AS StartOfYear, 
CONVERT(varchar(50), DATEADD(yy, DATEDIFF(yy,0,getdate()) + 1, -1),105) AS EndOfYear 
1

下面是一個case語句,您可以使用它來爲日期值創建Weekbegin。它會讓你的星期在星期一或星期二或星期三開始......依賴於你設置爲@pDate的星期幾。

創建參數

DECLARE @pDate Date = NULL --Replace with your date, which will also be the first day of the week 
DECLARE @pDatePart SMALLINT = DATEPART(dw, @pDate) 

然後把這種情況下,聲明你的選擇

CASE 
    WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN @pDatePart AND 7 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)[email protected], CAST(DATEVALUE AS DATE)) 
    WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN 1 AND @pDatePart-1 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)+(@pDatePart-7), CAST(DATEVALUE AS DATE)) 
    END 
    AS DynamicWeekBegin 

你總是可以,只需使用DATEADD(d,6獲得一週的最後日期,案後聲明)

相關問題