¿Cómo mostrar fecha faltantes de una columna de tabla sql server?

Como puedo mostrar las fechas faltantes de una columna de una tabla sql server es decir
Tengo una tabla llamada BITÁCORA con un campo llamado FECHA_CITADO, y tengo varias fechas que corresponden a días hábiles LUNES A VIERNES: ejemplo

Tabla: bitácora

FECHA_CITADO

13/abr/2020.....LUNES

16/abr/2020.....JUEVES

21/abr/2020....MARTES

24/abr/2020...VIERNES

y lo que necesito es que muestre las fechas faltantes:

14/abr/2020....MARTES

15/abr/2020...MIERCOLES

17/abr/2020....VIERNES

20/abr/2020...LUNES

21/abr/2020...MARTES

22/abr/2020...MIERCOLES

23/abr/2020...JUEVES

Así sucesivamente en el caso que se vaya agregando más fechas al campo

1 respuesta

Respuesta
1

este artículo, aunque está explicado para Access, el sistema es perfectamente válidoen SQL Server: http://emilioverastegui.blogspot.com/2015/09/la-tabla-numeros.html

Y aquí tienes un script de SQLServer para generar esa tabla números: https://geeks.ms/ghernandez/2012/07/15/esa-til-tabla-de-nmeros-en-sql-server/

Esta buena la información, pero ahí usan como parámetro una fecha inicial en un campo y fecha final de otro campo y lo que tengo en una sola columna tabla "BITACORA" campo "FECHA_CITADO" todas las fechas otorgadas es decir las fechas asignadas a los pacientes dentro de un rango de días hábiles (LUNES A VIERNES) y lo que necesito que en otra tabla temporal podríamos decir me muestre las fechas faltantes sin que me vuelva a mostrar las que ya fueron asigandas siempre en el parámetro de día hábiles (LUNES A VIERNES)

Gracias de antemano

Veo que no has leído bien el artículo o no lo has entendido... En el ejemplo "Encontrar las fechas que faltan:", el punto de partida es una tabla con un solo campo de fecha (tabla fecha faltante), que es exactamente lo mismo que tu tienes en tu tabla bitácora.

A partir de esa tabla, crea una consulta (Consulta1) que devuelve las fechas más baja y más alta para cada grupo (campo "nombre" en el ejemplo). En tu caso, según lo que necesites, puedes hacerlo por paciente (la consulta tendrá tantos registros como pacientes tengas) o en general (la consulta devolverá un solo registro)

Con esa consulta y la tabla "números", genera todas las fechas entre esas dos fechas en la Consulta2

Y por último, con la tabla inicial y la consulta2, busca las fechas que no figuran en la tabla.

En tu caso concreto, bien en la consulta2 o en la final, tendrías que añadir una cosilla, que te filtre solo las fechas que corresponden a lunes-viernes.

Dicho esto, si tu tabla se llama TBitacora y tiene el campo Fecha_Citado, y una vez que crees la tabla Nums (según el script comentado arriba) la siguiente consulta te devolverá los días que no tienen cita siempre que sean lunes, martes, miércoles, jueves o viernes:

SELECT    TOP (100) PERCENT Consulta2.Lasfechas, datename(WEEKDAY,Consulta2.Lasfechas) AS DiaSemana
FROM (SELECT TOP (100) PERCENT DATEADD(DAY, dbo. Nums.n, Consulta1. Inicio) AS Lasfechas
FROM         dbo.Nums INNER JOIN
                      (SELECT MIN(Fecha_Citado) AS Inicio, MAX(Fecha_Citado) AS Final
FROM         dbo.TBitacora) AS Consulta1 ON DATEADD(DAY, dbo.Nums.n, Consulta1.Inicio) <= Consulta1.Final
WHERE     (DATEPART(WEEKDAY, DATEADD(DAY, dbo.Nums.n, Consulta1.Inicio)) IN (1, 2, 3, 4, 5))
ORDER BY Lasfechas) AS Consulta2 LEFT OUTER JOIN
                      dbo.TBitacora ON Consulta2.Lasfechas = dbo.TBitacora.Fecha_Citado
WHERE     (dbo.TBitacora.Fecha_Citado IS NULL)
ORDER BY Consulta2. Lasfechas

Le he añadido un campo para que veas el día de la semana.

Si lo prefieres hacer "por partes":

Consulta1: 

SELECT MIN(Fecha_Citado) AS Inicio, MAX(Fecha_Citado) AS Final FROM dbo.TBitacora

Consulta2:

SELECT TOP (100) PERCENT DATEADD(DAY, dbo.Nums.n, dbo.Consulta1.Inicio) AS Lasfechas
FROM dbo.Nums INNER JOIN dbo.Consulta1 ON DATEADD(DAY, dbo.Nums.n, dbo.Consulta1.Inicio) <= dbo.Consulta1.Final
WHERE (DATEPART(WEEKDAY, DATEADD(DAY, dbo.Nums.n, dbo.Consulta1.Inicio)) IN (1, 2, 3, 4, 5)) ORDER BY Lasfechas

Consulta final:

SELECT    TOP (100) PERCENT dbo.Consulta2.Lasfechas, datename(WEEKDAY,dbo.Consulta2.Lasfechas) AS DiaSemana
FROM         dbo.Consulta2 LEFT OUTER JOIN
                      dbo.TBitacora ON dbo.Consulta2.Lasfechas = dbo.TBitacora.Fecha_Citado
WHERE     (dbo.TBitacora.Fecha_Citado IS NULL)
ORDER BY dbo. Consulta2. Lasfechas

que son las mismas consultas del artículo, adaptadas a la sintaxis SQLServer

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas