2009-11-25 30 views

Trả lời

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

Edit: Một chính xác, cuối cùng, làm việc trả lời từ đồng nghiệp của tôi.

0

Thánh bò, đây là xấu xí, nhưng ở đây đi:

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))) 
0

Lần đầu tiên xây dựng bảng kiểm đếm. http://www.sqlservercentral.com/articles/T-SQL/62867/ sau đó nhận được những gì bạn muốn ..

http://www.sqlservercentral.com/Forums/Topic515226-1291-1.aspx

DECLARE @DateStart DATETIME, 
     @DateEnd DATETIME 

SELECT @DateStart = '20080131', 
     @DateEnd = '20101201' 

SELECT DATEADD(wk,DATEDIFF(wk,6,DATEADD(mm,DATEDIFF(mm,-1,DATEADD(mm,t.N-1,@DateStart)),-1)),6) 
    FROM dbo.Tally t 
    WHERE t.N <= DATEDIFF(mm,@DateStart,@DateEnd) 
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

không thành công cho hầu hết các cài đặt không phải bằng tiếng Anh ... – gbn

2

Một cách tiếp cận khác, vay mượn từ thực hành kho dữ liệu. Tạo bảng kích thước ngày và tải trước trong 10 năm hoặc lâu hơn.

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

Cách dễ nhất để điền vào dimDate là dành một buổi chiều với Excel và sau đó nhập vào DB từ đó. Bảng dimDate có một nửa phong nha có hơn 50 cột - bất cứ điều gì bạn muốn biết về một ngày.

Với điều này tại chỗ, câu hỏi trở thành một cái gì đó như:

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

Về cơ bản, tất cả các truy vấn liên quan đến ngày trở nên đơn giản.

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

không sql 2000 như câu hỏi ban đầu đã nêu – DasDave

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

Tiếp Chủ Nhật trong SQL, bất kể ngày nào là ngày đầu tiên của tuần: trả về 2011/01/02 23: 59: 59.000 vào ngày 22-Dec-2010:

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

tôi tìm một số giải pháp này khó hiểu nên đây là phiên bản của tôi có các biến để giải thích các bước.

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 
Các vấn đề liên quan