2009-11-25 141 views

回答

11
SELECT 
DATEADD(day,DATEDIFF(day,'19000107',DATEADD(month,DATEDIFF(MONTH,0,GETDATE() /*YourValuehere*/),30))/7*7,'19000107') 

編輯:正確的,最後,工作從我的同事回答。

0

天哪,這是醜陋的,但這裏有雲:

DECLARE @dtDate DATETIME 
SET @dtDate = '2009-11-05' 

SELECT DATEADD(dd, -1*(DATEPART(dw, DateAdd(day, -1, DateAdd(month, DateDiff(month, 0, @dtDate)+1, 0)))-1), 
      DateAdd(day, -1, DateAdd(month, DateDiff(month, 0, @dtDate)+1, 0))) 
1
DECLARE @LastDateOfMonth smalldatetime 
SELECT @LastDateOfMonth = DATEADD(month, DATEDIFF(month, -1, GETDATE()), 0) -1 
Select DATEADD(dd,-(CASE WHEN DATEPART(weekday,@LastDateOfMonth) = 1 THEN 0 ELSE DATEPART(weekday,@LastDateOfMonth) - 1 END),@LastDateOfMonth) 
+2

不適用於大多數非美國英語安裝... – gbn 2009-11-25 15:00:14

2

的另一種方法,從數據倉庫實踐借來的。創建一個日期維度表並預加載10年左右。

TABLE dimDate (DateKey, FullDate, Day, Month, Year, DayOfWeek, 
       DayInEpoch, MonthName, LastDayInMonthIndicator, many more..) 

以填補在dimDate最簡單的方法是一個下午花與Excel,然後從那裏導入到數據庫中。一半體面dimDate表有50多列 - 任何你想知道約會的東西。

有了這個地方,問題就變成這樣的:

SELECT max(FullDate) 
FROM dimDate 
WHERE DayOfWeek = 'Sunday' 
     AND Month = 11 
     AND Year = 2009; 

從本質上講,所有日期相關的查詢變得更簡單。

-1
select next_day(last_day(sysdate)-7, 'Sunday') from dual 
+0

不是原始問題聲明的sql 2000 – DasDave 2015-08-17 10:29:05

3
select dateadd(day,1-datepart(dw, getdate()), getdate()) 
2

下週日在SQL,無論哪一天是一週的第一天:返回2011-01-02 23:59:59.000在22日 - 12月2010:

select DateADD(ss, -1, DATEADD(week, DATEDIFF(week, 0, getdate()), 14)) 
1

我找到一些難以理解的解決方案,所以這裏是我的帶變量的版本來解釋步驟。

ALTER FUNCTION dbo.fn_LastSundayInMonth 
(
    @StartDate DATETIME 
,@RequiredDayOfWeek INT /* 1= Sunday */ 
) 
RETURNS DATETIME 
AS 
/* 
A detailed step by step way to get the answer... 

SELECT dbo.fn_LastSundayInMonth(getdate()-31,1) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,2) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,3) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,4) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,5) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,6) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,7) 
*/ 
BEGIN 
    DECLARE @MonthsSince1900 INTEGER 
    DECLARE @NextMonth INTEGER 
    DECLARE @DaysToSubtract INTEGER 
    DECLARE @FirstDayOfNextMonth DATETIME 
    DECLARE @LastDayOfMonthDayOfWeek INTEGER 
    DECLARE @LastDayOfMonth DATETIME 
    DECLARE @ReturnValue DATETIME 

    SET @MonthsSince1900=DateDiff(month, 0, @StartDate) 
    SET @[email protected]+1 
    SET @FirstDayOfNextMonth = DateAdd(month,@NextMonth, 0) 
    SET @LastDayOfMonth = DateAdd(day, -1, @FirstDayOfNextMonth) 

    SET @ReturnValue = @LastDayOfMonth 

    WHILE DATEPART(dw, @ReturnValue) <> @RequiredDayOfWeek 
     BEGIN 
      SET @ReturnValue = DATEADD(DAY,-1, @ReturnValue) 
     END 

    RETURN @ReturnValue 
END 
相關問題