Estoy tratando de obtener el número de días entre dos fechas diferentes, excepto los fines de semana.
No sé cómo lograr este resultado.
postgresql
datetime
pragati basa
fuente
fuente
Respuestas:
Suponiendo que por "fin de semana" te refieres a sábado y domingo , esto puede ser aún más simple:
No necesita un nivel de subconsulta adicional para
generate_series()
. SRF (establecer funciones de retorno), también conocido como "funciones de tabla", se puede utilizar como tablas en laFROM
cláusula.Tenga en cuenta, en particular, que
generate_series()
incluye el límite superior en la salida, siempre que se ajuste a un intervalo completo (tercer parámetro). El límite superior solo se excluye si se trunca el último intervalo, que no es el caso con días completos.Con el patrón
ISODOW
EXTRACT () , los domingos se informan de7
acuerdo con el estándar ISO. Permite unaWHERE
condición más simple .Más bien llamar
generate_series()
contimestamp
entrada. Aquí es por qué:count(*)
es ligeramente más corto y más rápido quecount(the_day)
, haciendo lo mismo en este caso.Para excluir el límite inferior y / o superior, sume / reste 1 día en consecuencia. Por lo general, puede incluir el límite inferior y excluir el límite superior:
fuente
Este ejemplo enumera todas las fechas entre 2013-12-15 y 2014-01-02 (inclusive). La segunda columna muestra el día de la semana (numéricamente, entre 0 y 6). La tercera columna marca si el día de la semana es un sábado / domingo o no (tendrá que adaptar lo que considera que es un fin de semana) y es lo que podría usarse para contar los días de la semana.
fuente
Suponiendo que un fin de semana sea sábado y domingo, puede usar el siguiente SQL.
Reemplace las fechas con sus elecciones y el (0,6) con los días de la semana que desea excluir.
Algunas cosas que debe tener en cuenta:
No ha mencionado qué versión de PostgreSQL está ejecutando. Esto funciona en 9.1+ pero debería funcionar en versiones inferiores.
Las fechas elegidas son inclusivas cuando se utiliza generate_series. Entonces, si desea días intermedios, agregue 1 día a cada fecha.
fuente
Hay algunas cosas que puede hacer para facilitar esto. El método que usaría sería asegurarme de que haya una tabla de fechas disponible. Puede crear uno rápidamente así:
Una vez que se crea la tabla, debería poder rellenarla con datos de fecha relativamente rápido.
Luego puede escribir su consulta como un recuento rápido de registros de esta tabla.
fuente
Le sugiero que cree una función para usar cuando quiera y escriba menos; )
Este código anterior creará una función sql que contará y devolverá la cantidad de días de fin de semana (sábado, domingo). Justo como tendrá más flexibilidad para usar esta función.
Después de eso, puede usar la función para devolver solo la cantidad de días de fin de semana en un intervalo. Aquí está el ejemplo a usar:
Esta selección debe devolver cuatro porque el primer y el segundo día son lunes, y tenemos 2 sábados y 2 domingos entre ellos.
Ahora, para devolver solo los días hábiles (sin fines de semana), como desee , simplemente reste, como en el ejemplo a continuación:
fuente
fuente