none
calendario de mexico en sql RRS feed

  • Pregunta

  • Hola amigos, tengo q hacer una consulta q me muestre los dias del sistema de mi PC (solo se q existe el datatime) pero miren tengo un proyecto para dentro de 4 dias el cual es hacer una consulta donde me diga el calendario de mi PC PERO ademas me muestre los dias festivos y si algun dia festivo (de mexico) cae entre semana (martes,miercoles) se artrase a el lunes de esa semana pero si cae otro dia (jueves y viernes) se adelante el lunes de la sig semana, por obvias razones la consulta me tiene que decir q dia del mes es para adelantar o atrasar la fecha y que todos los dias festivos (no laborables) caigan en lunes, si me pueden ayudar seria bueno y miren esto es lo unico que pude ver......
    --Asignacion de lenguage de la sesion de base de datos
    SET LANGUAGE SPANISH

    --Fecha inicial desde la cual se va a crear la tabla con los dias festivos
    DECLARE @fecha AS DATETIME
    SET @fecha = '2005-01-01 00:00:00.000'

    --Se eliminan datos de la tabla de Fechas
    TRUNCATE TABLE Tiempo

    IF EXISTS(SELECT name FROM sysobjects WHERE name = N'Fechas' AND xtype='U')
          DROP TABLE Fechas
    create table Fechas
    ( fecha datetime )

    -- Se inserta las fechas desde 2005-01-01 hasta 2018-12-31
    while (@fecha < '2031-01-01 00:00:00.000')
    begin
          INSERT      INTO fechas
          SELECT      @fecha
          SELECT      @fecha = @fecha +1
    END

    --Se declara cursor para generar la insercion de datos en la tabla tiempo
    DECLARE fechas_cursor CURSOR FOR
    SELECT      Fecha 
    FROM  Fechas

    OPEN fechas_cursor

    FETCH NEXT FROM fechas_cursor
    INTO @fecha

    WHILE @@FETCH_STATUS = 0
    BEGIN
          INSERT      INTO tiempo
          SELECT      @fecha Fecha,
                      YEAR(@fecha) as Año,
                      month(@fecha) as Mes,
                      day(@fecha) as Dia,
                      DATENAME(mm, @FECHA) MesNombre,
                      DATENAME(dw, @FECHA) DiaNombre,
                      datepart(dy,@fecha) as DiaAño,
                      convert(varchar(10),datepart(wk,@fecha)) SemanaAño,
                      CASE WHEN MONTH(@fecha)<= 6  THEN '1' ELSE '2' END Semestre,
                      CASE WHEN MONTH(@fecha)<= 3  THEN '1'
                             WHEN MONTH(@fecha)<= 6  THEN '2'
                             WHEN MONTH(@fecha)<= 9  THEN '3'
                             WHEN MONTH(@fecha)<= 12 THEN '4' END Trimestre,
                      case WHEN MONTH(@fecha)<= 4  THEN '1'
                             WHEN MONTH(@fecha)<= 8  THEN '2'
                             WHEN MONTH(@fecha)<= 12  THEN '3'END Cuatrimestre,
                      CASE WHEN DATEPART(DW, @fecha) = 6 THEN 0 -- Se marca el dia sabado como dia no habil
                             WHEN DATEPART(DW, @fecha) = 7 THEN 0 -- Se marca el dia domingo como dia no habil
                             ELSE 1 END DiaHabil

          FETCH NEXT FROM fechas_cursor
          INTO @fecha
    END
    CLOSE fechas_cursor;
    DEALLOCATE fechas_cursor;


    -- Se marcan los dias festivos como dias no habiles
    UPDATE      tiempo SET diahabil = 0
    FROM  TIEMPO T
                INNER JOIN FESTIVOS F ON Convert(varchar(10),T.fecha,101) = Convert(varchar(10),F.[Fecha],101)


    --Eliminar tabla temporal
    IF EXISTS(SELECT name FROM sysobjects WHERE name = N'Fechas' AND xtype='U')
          DROP TABLE Fechas


    --Resultado final
    select * from tiempo
    • Editado Abebraham martes, 21 de marzo de 2017 23:15 Errores en la ortografia
    martes, 21 de marzo de 2017 23:14

Todas las respuestas

  • Abebraham,

    Intenta con la siguiente consulta:

    DECLARE @FechaInicio date = '20050101';
    DECLARE @FechaFin date = '20310101';
    WITH Fechas (Fecha) AS
    (
        SELECT @FechaInicio
        UNION ALL
        SELECT DATEADD(DAY, 1, Fecha) FROM Fechas WHERE (Fecha < @FechaFin)
    )
    INSERT INTO dbo.tiempo
    SELECT 
        f.Fecha AS [Fecha],
        YEAR(f.Fecha) AS [Año],
        MONTH(f.Fecha) AS [Mes],
        DAY(f.Fecha) AS [Dia],
        DATENAME(MONTH, f.Fecha) AS [MesNombre],
        DATENAME(WEEKDAY, f.Fecha) AS [DiaNombre],
        DATEPART(DAYOFYEAR, f.Fecha) AS [DiaAño],
        DATEPART(WEEK, f.Fecha) AS [SemanaAño],
        CASE WHEN MONTH(f.Fecha) <= 6 THEN 1 ELSE 2 END AS [Semestre],    
        CASE 
    	   WHEN MONTH(f.Fecha) <= 4 THEN 1 
    	   WHEN MONTH(f.Fecha) <= 8 THEN 2 
    	   ELSE 3 
        END AS [Trimestre],
        DATEPART(QUARTER, f.Fecha) AS [Cuatrimestre],
        CASE 
    	   WHEN DATEPART(WEEKDAY, f.Fecha) BETWEEN 6 AND 7 THEN 0 
    	   WHEN DATEPART(WEEKDAY, f.Fecha) = 1 /*Lunes*/ 
    		  AND EXISTS (SELECT 1 FROM FESTIVOS t
    			 WHERE 
    				t.Fecha BETWEEN f.Fecha AND DATEADD(DAY, 2, f.Fecha)
    				OR t.Fecha BETWEEN DATEADD(DAY, -4, f.Fecha) AND f.Fecha) THEN 0
    	   ELSE 1 
        END AS [DiaHabil]
    FROM 
        Fechas f     
        OPTION(MAXRECURSION 10000);
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 22 de marzo de 2017 4:51
  • va muchas gracias lo probare de inmediato 

    miércoles, 22 de marzo de 2017 22:51