2009-11-25 28 views

Respuesta

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

edición: A, final, la respuesta correcta de trabajo de mi colega.

0

vaca Santo, esto es feo, pero aquí va:

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

falla para la mayoría de las instalaciones no inglés de Estados Unidos ... – gbn

2

Un enfoque alternativo, tomado de la práctica de almacenamiento de datos. Cree una tabla de dimensión de fecha y precarguela durante 10 años, más o menos.

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

La forma más fácil de rellenar el dimDate es pasar una tarde con Excel y luego importar a DB desde allí. Una mesa mediocre de dimDate tiene más de 50 columnas, cualquier cosa que siempre quisiste saber sobre una fecha.

Con esto en su lugar, la cuestión se convierte en algo así como:

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

En esencia, todas las consultas relacionadas con la fecha se vuelven más simples.

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

no SQL 2000 como pregunta original declarado – DasDave

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

próximo domingo en SQL, que sin tener en cuenta el día es día de la semana: devuelve 2011-01-02 23: 59: 59.000 el 22-Dic-2010:

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

I Algunas de estas soluciones son difíciles de entender, así que aquí está mi versión con variables para explicar los pasos.

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 
Cuestiones relacionadas