2009-10-01 43 views
5

Buscando la forma de obtener la fecha en el formato "11/1/2009", que sería el primer domingo del próximo mes. Quiero ejecutar esta consulta después del primer domingo de octubre para obtener el primer domingo del próximo mes. ¿Cuál es el mejor método para lograr esto con una consulta T-SQL?Obtenga el primer domingo del próximo mes con T-SQL

Gracias

+0

¿Desea ejecutar esta consulta solo una vez? O bien, ¿desea una consulta que siempre usará la fecha del próximo primer domingo (de modo que si ha sucedido en el mes actual, recibe esta, pero si ha pasado, se obtiene el próximo mes)? – Anthony

+0

Corrija que se ejecute cada mes para obtener la fecha del primer domingo del mes siguiente. Se ejecutará en un trabajo y establecerá una fecha en una tabla que almacena la próxima fecha allí. – Matt

+0

Si siempre quiere el mes "siguiente", del cual no estaba seguro, no necesita la complicada solución que publiqué. :) –

Respuesta

7

Prueba esto:

Declare @D Datetime 
Set @D = [Some date for which you want the following months' first sunday] 
Select DateAdd(day, (8-DatePart(weekday, 
    DateAdd(Month, 1+DateDiff(Month, 0, @D), 0)))%7, 
    DateAdd(Month, 1+DateDiff(Month, 0, @D), 0)) 

Notas Editar:

El primero del próximo mes es dado por la expresión:

DateAdd(Month, 1+DateDiff(Month, 0, @D), 0) 

o por: que puede ser modificado para dar el primero del mes dos meses a partir de ahora cambiando el 1 a un 2:

DateAdd(Month, 2+DateDiff(Month, 0, @D), 0) 

EDIT: En respuesta a @NissanFan y @Anthony: Para modificar este para devolver el primer Lunes Martes Miércoles, etc, cambie el valor 8 a un 9, 10, 11, etc ....

Declare @Sun TinyInt Set @Sun = 8 
Declare @Mon TinyInt Set @Mon = 9 
Declare @Tue TinyInt Set @Tue = 10 
Declare @Wed TinyInt Set @Wed = 11 
Declare @Thu TinyInt Set @Thu = 12 
Declare @Fri TinyInt Set @Fri = 13 
Declare @Sat TinyInt Set @Sat = 14 
Declare @D Datetime, @FONM DateTime -- FirstofNextMonth 
Set @D = [Some date for which you want the following months' first sunday] 
Set @FONM = DateAdd(Month, 1+DateDiff(Month, 0, @D),0) 

Select 
    DateAdd(day, (@Sun -DatePart(weekday, @FONM))%7, @FONM) firstSunInNextMonth, 
    DateAdd(day, (@Mon -DatePart(weekday, @FONM))%7, @FONM) firstMonInNextMonth, 
    DateAdd(day, (@Tue -DatePart(weekday, @FONM))%7, @FONM) firstTueInNextMonth, 
    DateAdd(day, (@Wed -DatePart(weekday, @FONM))%7, @FONM) firstWedInNextMonth, 
    DateAdd(day, (@Thu -DatePart(weekday, @FONM))%7, @FONM) firstThuInNextMonth, 
    DateAdd(day, (@Fri -DatePart(weekday, @FONM))%7, @FONM) firstFriInNextMonth, 
    DateAdd(day, (@Sat -DatePart(weekday, @FONM))%7, @FONM) firstSatInNextMonth 
+0

Muy agradable. Mucho más compacto. ¿Cómo podría esto adaptarse para seleccionar, digamos ... el primer miércoles? –

+0

¡Cambiaría el% 7 a un% 3 – Anthony

+0

Módulo! Por supuesto. ¿Conoces una manera fácil de hacerlo el segundo martes de un mes, por ejemplo? Gran pequeña función. –

1

Como digo en lugar de subir con algo de código para hacer esto cómo sobre el uso de una tabla de calendario.

Tome un vistazo a esto: http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

Esto también puede ayudar: http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=99696

+0

Siempre he tenido miedo de usar una tabla para fechas almacenadas como estas. Las vacaciones están bien ya que podemos localizarlas, ¿pero los fines de semana? –

1

Puede utilizar DATENAME para determinar el día que desee, Me podría recomendar un bucle para mover la fecha del 01 de el mes en cuestión para llegar al primer domingo.

Así que vamos a tratar:

DECLARE @DateTime DATETIME 

establece en la fecha para empezar, a continuación, añadir al menos 1 día hasta que encuentre lo que busca. Use datename con dw ...

Hemos usado esto para determinar los fines de semana, pero las vacaciones serán un problema, donde usamos una tabla para almacenar eso.

0

probar este código como una función:

-- Variables 
DECLARE @DATE DATETIME 
DECLARE @DAY INT 
DECLARE @DAYOFWEEK INT 
DECLARE @TESTDATE DATETIME 

-- Set 
SET @TESTDATE = GETDATE() 
SET @DATE = DATEADD(MONTH, 1, @TESTDATE) 
SET @DAY = DATEPART(DAY, @TESTDATE) 
SET @DATE = DATEADD(DAY, [email protected] + 1, @DATE) 
SET @DAYOFWEEK = DATEPART(WEEKDAY, @DATE) 
IF @DAYOFWEEK > 1 
BEGIN 
    SET @DAYOFWEEK = 8 - @DAYOFWEEK 
END 
ELSE 
BEGIN 
    SET @DAYOFWEEK = 0 
END 

SET @DATE = DATEADD(DAY, @DAYOFWEEK, @DATE) 

-- Display 
PRINT @TESTDATE 
PRINT @DAY 
PRINT @DAYOFWEEK 
PRINT @DATE 
0

Aquí es la forma específica no es del sistema para determinar el primer domingo del mes siguiente:

primer lugar, obtener el mes en curso y añadir un mes. A continuación, configure la fecha de esa variable para que esté en la primera. A continuación, encuentre el valor del día de esa fecha (supongamos que los lunes son 1 y los domingos son 7). A continuación, reste el valor del día del 1 ° del mes del valor del día del domingo (7).

Ahora tiene la cantidad de días entre el primero del mes y el primer domingo. A continuación, puede agregar eso a la variable de fecha para obtener el primer domingo o, dado que sabemos que el primero del mes es 1, puede agregar uno a la diferencia (que se encuentra en el último paso anterior) y esa es la fecha de el primer domingo. (Debe agregar uno porque resta y, por lo tanto, si el primero del mes dado ES domingo, terminará con 0).

He estado revisando la documentación de T-SQL y no es intuitivo en cuanto a cómo usaría mi método, pero necesitará el concepto de "día del número de la semana" para que funcione sin importar qué.

0

Esto sería lo más simple con una tabla de calendario auxiliar. Ver this link, por ejemplo.

Sin embargo, se puede hacer sin uno, aunque es bastante complicado. Aquí supongo que quieres la primera fecha futura que sea el primer domingo de un mes. He escrito esto con una variable @now for - well - now, así que es más fácil de probar. Podría ser posible escribir de manera más simple, pero creo que esto tiene más posibilidades de ser correcto que las soluciones simples escritas rápidamente. [Corregir añadiendo DÍA (d) < 8]

SET @now = GETDATE(); 
WITH Seven(i) AS (
    SELECT -1 UNION ALL SELECT 0 UNION ALL SELECT 1 
      UNION ALL SELECT 3 UNION ALL SELECT 4 
      UNION ALL SELECT 5 UNION ALL SELECT 6 
), Candidates(d) AS (
    SELECT DATEADD(WEEK,i+DATEDIFF(WEEK,'19000107',@now),'19000107') 
    FROM Seven 
) 
    SELECT TOP (1) d AS SoonestFutureFirstSunday 
    FROM Candidates 
    WHERE DAY(d) < 8 AND MONTH(d) >= MONTH(@now) 
    AND (MONTH(d) > MONTH(@now) OR DAY(d) > DAY(@now)) 
    ORDER BY d;  ORDER BY d; 
1

Aquí es una consulta para obtener el primer día hábil del mes siguiente

DECLARE @DAYOFWEEK INT,@ReminderDate DateTime 
SET @DAYOFWEEK = DATEPART(WEEKDAY,DateAdd(D,- Day(GetDate())+1, DATEADD(M,1,GetDate()))) 
Print @DAYOFWEEK 
If @DAYOFWEEK = 1 
Set @ReminderDate = DateAdd(D,- Day(GetDate())+2, DATEADD(M,1,GetDate())) 
Else If @DAYOFWEEK =7 
Set @ReminderDate = DateAdd(D,- Day(GetDate())+3, DATEADD(M,1,GetDate())) 
Else 
Set @ReminderDate = DateAdd(D,- Day(GetDate())+1, DATEADD(M,1,GetDate())) 
Print @ReminderDate 
0

calculo que la respuesta es la siguiente

SELECT DATEADD(Month, DATEDIFF(Month, 0, GETDATE()) + 1, 0) + 6 - (DATEPART(Weekday, 
        DATEADD(Month, 
         DATEDIFF(Month,0, GETDATE()) + 1, 0)) 
        + @@DateFirst + 5) % 7 --FIRST sunday of following month 
+0

La razón por la cual esto es un poco obtuso es que la función tiene que funcionar cualquiera que sea su configuración DateFirst. Las diferentes nacionalidades comienzan la semana en un día diferente. De manera predeterminada, Datefirst es 7, pero eso no siempre es así. No señor. Si quiere días diferentes, cambie los cinco al final por cualquier valor entre 0 y 6 para ver qué sucede –

0

Reference taken from this blog:

SQL Server 2012 introdujo un nuevo TSQL EOMONTH para devolver el último día del mes que contiene la fecha especificada con un desplazamiento opcional.

CREATE TABLE tbl_Test_EOMONTH 
(
    SampleDate DATETIME 
) 
GO 

INSERT INTO tbl_Test_EOMONTH VALUES ('2015-12-20') 
INSERT INTO tbl_Test_EOMONTH VALUES ('2015-11-08') 
INSERT INTO tbl_Test_EOMONTH VALUES ('2015-10-16') 
INSERT INTO tbl_Test_EOMONTH VALUES ('2015-09-26') 
INSERT INTO tbl_Test_EOMONTH VALUES ('2016-01-31') 
GO 

SELECT 
    DATEADD(DAY,8-DATEPART(WEEKDAY,DATEADD(DAY,0,EOMONTH([SampleDate]))) 
    ,EOMONTH([SampleDate])) AS FirstSunday_ofTheNextMonth 
FROM tbl_Test_EOMONTH 
GO 
Cuestiones relacionadas