none
Saber los festivos nacionales y autonómicos de una serie de registros (con Fecha y Sede-Provincia) RRS feed

  • Pregunta

  • Uso SQL Server 2016 Standard, aunque también obtengo datos de SQL SERVER 2012.

    Utilizo tablas temporales, y al final logro esta información:

    #HistoricoUserTable2
    usuario      | UsuarioHermes |   Fecha    |       FechaLogin        |       FechaLogout       | DiaSemana

    #ODActionsTable2
    usuarioHermes |   Fecha    |       FechaLogin2       |      FechaLogout2       | DiaSemana |


    Nota: La diferencia entre FechaLogin y FechaLogin2, y  FechaLogout y  FechaLogout2 es mínima, pocos segundos, a priori.

    select * from #HistoricoUserTable2  H2 FULL OUTER JOIN #ODActionsTable2 A2 ON H2.UsuarioHermes = A2.UsuarioHermes AND H2.Fecha = A2.Fecha ORDER BY H2.UsuarioHermes, H2.FECHA


    Los resultados quedarían así:

    +-------------------+---------------+------------+-------------------------+-------------------------+-----------+---------------+------------+-------------------------+-------------------------+-----------+
    |      usuario      | UsuarioHermes |   Fecha    |       FechaLogin        |       FechaLogout       | DiaSemana | usuarioHermes |   Fecha    |       FechaLogin2       |      FechaLogout2       | DiaSemana |
    +-------------------+---------------+------------+-------------------------+-------------------------+-----------+---------------+------------+-------------------------+-------------------------+-----------+
    | aida.X            |          1613 | 2019-06-13 | 2019-06-13 08:52:04.000 | 2019-06-13 14:00:22.000 | Jueves    | 1613          | 2019-06-13 | 2019-06-13 08:53:06.607 | 2019-06-13 14:00:16.300 | Jueves    |
    | aida.X            |          1613 | 2019-06-17 | 2019-06-17 08:49:35.000 | 2019-06-17 14:00:15.000 | Lunes     | 1613          | 2019-06-17 | 2019-06-17 08:50:31.013 | 2019-06-17 14:00:12.190 | Lunes     |
    | aida.X            |          1613 | 2019-06-18 | 2019-06-18 08:48:39.000 | 2019-06-18 14:00:40.000 | Martes    | NULL          | NULL       | NULL                    | NULL                    | NULL      |
    | alejandra.Z       |          1614 | 2019-06-13 | 2019-06-13 08:40:58.000 | 2019-06-13 14:01:56.000 | Jueves    | 1614          | 2019-06-13 | 2019-06-13 08:53:43.950 | 2019-06-13 14:01:51.017 | Jueves    |
    | alejandra.Z       |          1614 | 2019-06-17 | 2019-06-17 08:36:28.000 | 2019-06-17 14:00:33.000 | Lunes     | 1614          | 2019-06-17 | 2019-06-17 08:49:58.810 | 2019-06-17 14:00:31.250 | Lunes     |
    | alejandra.Z       |          1614 | 2019-06-18 | 2019-06-18 08:50:16.000 | 2019-06-18 14:01:35.000 | Martes    | NULL          | NULL       | NULL                    | NULL                    | NULL      |
    +-------------------+---------------+------------+-------------------------+-------------------------+-----------+---------------+------------+-------------------------+-------------------------+-----------+


    La idea es:

    A partir de la "Fecha", saber si la fecha es Domingo),
    y saber si es Festivo Nacional o Festivo Autonómico (sabiendo la Sede del usuario).

    Si UsuarioHermes (por ejemplo, 1614) empieza por 1, la sede es MAD

    Si UsuarioHermes (por ejemplo, 3134) empieza por 3, la sede es SEV

    Si UsuarioHermes (por ejemplo, 4117) empieza por 4, la sede es BCN


    Tenemos tablas en un sistema NAVISION de Calendario:

    Nacional

    select ano, mes, [dia festivo 1], [dia festivo 2], [dia festivo 3] , [dia festivo 4] FROM [NAVISION\SQL2014].LABOR.dbo.[Calendario General] where ano = YEAR(GETDATE())

    +------+-----+---------------+---------------+---------------+---------------+
    | ano  | mes | dia festivo 1 | dia festivo 2 | dia festivo 3 | dia festivo 4 |
    +------+-----+---------------+---------------+---------------+---------------+
    | 2019 |   1 |             1 |             0 |             0 |             0 |
    | 2019 |   2 |             0 |             0 |             0 |             0 |
    | 2019 |   3 |             0 |             0 |             0 |             0 |
    | 2019 |   4 |            19 |             0 |             0 |             0 |
    | 2019 |   5 |             1 |             0 |             0 |             0 |
    | 2019 |   6 |             0 |             0 |             0 |             0 |
    | 2019 |   7 |             0 |             0 |             0 |             0 |
    | 2019 |   8 |            15 |             0 |             0 |             0 |
    | 2019 |   9 |             0 |             0 |             0 |             0 |
    | 2019 |  10 |            12 |             0 |             0 |             0 |
    | 2019 |  11 |             1 |             0 |             0 |             0 |
    | 2019 |  12 |             6 |            25 |             0 |             0 |
    +------+-----+---------------+---------------+---------------+---------------+

    Autonómico
    Cod_ comunid_ auton '01' para SEV

    Cod_ comunid_ auton '09' para BCN

    Cod_ comunid_ auton '12' para MAD

    select [Cod_ comunid_ auton_] , ano, mes, [dia festivo 1], [dia festivo 2], [dia festivo 3] , [dia festivo 4] FROM [NAVISION\SQL2014].LABOR.dbo.[Calendario Comunidad Autonoma] 
    WHERE [Cod_ comunid_ auton_] in ('01','09','12') and  ano = YEAR(GETDATE()) order by [Cod_ comunid_ auton_],  mes
    +--------------+------+-----+---------------+---------------+---------------+---------------+
    | Cod_ comunid | ano  | mes | dia festivo 1 | dia festivo 2 | dia festivo 3 | dia festivo 4 |
    +--------------+------+-----+---------------+---------------+---------------+---------------+
    |           01 | 2019 |   1 |             7 |             0 |             0 |             0 |
    |           01 | 2019 |   2 |            28 |             0 |             0 |             0 |
    |           01 | 2019 |   4 |            18 |             0 |             0 |             0 |
    |           01 | 2019 |  12 |             9 |             0 |             0 |             0 |
    |           09 | 2019 |   4 |            22 |             0 |             0 |             0 |
    |           09 | 2019 |   6 |            24 |             0 |             0 |             0 |
    |           09 | 2019 |   9 |            11 |             0 |             0 |             0 |
    |           09 | 2019 |  12 |            26 |             0 |             0 |             0 |
    |           12 | 2019 |   1 |             7 |             0 |             0 |             0 |
    |           12 | 2019 |   4 |            18 |             0 |             0 |             0 |
    |           12 | 2019 |   5 |             2 |             0 |             0 |             0 |
    |           12 | 2019 |  12 |             9 |             0 |             0 |             0 |
    +--------------+------+-----+---------------+---------------+---------------+---------------+


    Cuál sería la mejor forma de hacerlo ? una FUNCTION? un UPDATE sabiendo los días festivos entre dos fechas?
    Los días festivos de cada mes vienen en columnas, no en filas.

    Agradecería enormemente cualquier ayuda u orientación.


    jueves, 27 de junio de 2019 8:02

Todas las respuestas

  • Un apunte con UNPIVOT para obtener en calendario en filas:

    SELECT ano, mes, valorColumnaDiaFestivo
    FROM 
    (
    select ano, mes, [dia festivo 1], [dia festivo 2], [dia festivo 3] , [dia festivo 4] FROM [NAVISION\SQL2014].LABOR.dbo.[Calendario General] where ano = YEAR(GETDATE())
    ) P
    UNPIVOT (valorColumnaDiaFestivo FOR ColumnaDiaFestivo IN ([dia festivo 1], [dia festivo 2], [dia festivo 3] , [dia festivo 4])) AS unpvt
    WHERE valorColumnaDiaFestivo <> 0

    +------+-----+------------------------+
    | ano  | mes | valorColumnaDiaFestivo |
    +------+-----+------------------------+
    | 2019 |   1 |                      1 |
    | 2019 |   4 |                     19 |
    | 2019 |   5 |                      1 |
    | 2019 |   8 |                     15 |
    | 2019 |  10 |                     12 |
    | 2019 |  11 |                      1 |
    | 2019 |  12 |                      6 |
    | 2019 |  12 |                     25 |
    +------+-----+------------------------+


    Y con los festivos autonómicos:

    SELECT [Cod_ comunid_ auton_] Comunidad, ano, mes, valorColumnaDiaFestivo
    FROM 
    (
    select [Cod_ comunid_ auton_] , ano, mes, [dia festivo 1], [dia festivo 2], [dia festivo 3] , [dia festivo 4] FROM [NAVISION\SQL2014].LABOR.dbo.[Calendario Comunidad Autonoma] 
    WHERE [Cod_ comunid_ auton_] in ('01','09','12') and  ano = YEAR(GETDATE()) --order by [Cod_ comunid_ auton_],  mes
    ) P
    UNPIVOT (valorColumnaDiaFestivo FOR ColumnaDiaFestivo IN ([dia festivo 1], [dia festivo 2], [dia festivo 3] , [dia festivo 4])) AS unpvt
    WHERE valorColumnaDiaFestivo <> 0
    +-----------+------+-----+------------------------+
    | Comunidad | ano  | mes | valorColumnaDiaFestivo |
    +-----------+------+-----+------------------------+
    |        01 | 2019 |   1 |                      7 |
    |        01 | 2019 |   2 |                     28 |
    |        01 | 2019 |   4 |                     18 |
    |        01 | 2019 |  12 |                      9 |
    |        09 | 2019 |   4 |                     22 |
    |        09 | 2019 |   6 |                     24 |
    |        09 | 2019 |   9 |                     11 |
    |        09 | 2019 |  12 |                     26 |
    |        12 | 2019 |   1 |                      7 |
    |        12 | 2019 |   4 |                     18 |
    |        12 | 2019 |   5 |                      2 |
    |        12 | 2019 |  12 |                      9 |
    +-----------+------+-----+------------------------+




    jueves, 27 de junio de 2019 10:22