laborables habiles habil festivos fechas entre días dias calcular mysql sql

festivos - días habiles entre dos fechas mysql



Cómo contar la diferencia de fecha excluyendo fines de semana y días festivos en MySQL (5)

Algo como esto puede funcionar. Agregue todas las fechas de vacaciones y fines de semana a una mesa.

SELECT DATEDIFF(end_date, start_date) FROM table WHERE date NOT IN (SELECT date FROM holidaydatestable )

Necesito contar los días (días hábiles) entre dos fechas excluyendo el fin de semana (el más importante) y los días festivos

SELECT DATEDIFF(end_date, start_date) from accounts

Pero, no sé cómo se supone que debo hacerlo en MySQL, encontré este artículo Número de días entre dos fechas, excluyendo los fines de semana (solo MySQL) . No puedo averiguar cómo realizar consultas funcionales en mysql. ¿Puede dar alguna información de cómo puede lograr esto con mysql query? Si me falta algo házmelo saber.

[EDITAR]

CREATE TABLE `candidatecase` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT ''Unique ID'', `CreatedBy` int(11) NOT NULL, `UseraccountID` int(11) NOT NULL COMMENT ''User Account ID'', `ReportReadyID` int(11) DEFAULT NULL COMMENT ''Report Ready ID'', `DateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ''Date Created'', `InitiatedDate` timestamp NULL DEFAULT ''0000-00-00 00:00:00'' COMMENT ''Date Initiated'', `ActualCompletedDate` timestamp NULL DEFAULT ''0000-00-00 00:00:00'' COMMENT ''Date Completed Case'', `ProjectedCompletedDate` timestamp NULL DEFAULT ''0000-00-00 00:00:00'' COMMENT ''Date Projected Finish'', `CheckpackagesID` int(11) DEFAULT NULL COMMENT ''Default Check Package Auto Assign Once Initiate Start'', `Alacartepackage1` int(11) DEFAULT NULL COMMENT ''Ala carte Request #2'', `Alacartepackage2` int(11) DEFAULT NULL COMMENT ''Ala carte Request #3'', `OperatorID` int(11) NOT NULL COMMENT ''User Account - Operator'', `Status` int(11) NOT NULL COMMENT ''Status'', `caseRef` varchar(100) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=293 ; -- -- Dumping data for table `candidatecase` -- INSERT INTO `candidatecase` (`ID`, `CreatedBy`, `UseraccountID`, `ReportReadyID`, `DateCreated`, `InitiatedDate`, `ActualCompletedDate`, `ProjectedCompletedDate`, `CheckpackagesID`, `Alacartepackage1`, `Alacartepackage2`, `OperatorID`, `Status`, `caseRef`) VALUES (1, 43, 70, NULL, ''2011-07-22 02:29:31'', ''2011-07-07 07:27:44'', ''2011-07-22 02:29:31'', ''2011-07-17 06:53:52'', 11, NULL, NULL, 44, 6, ''''), (2, 43, 74, NULL, ''2012-04-03 04:17:15'', ''2011-07-11 07:07:23'', ''2011-07-13 05:32:58'', ''2011-07-21 07:01:34'', 20, 0, 0, 51, 0, ''''), (3, 43, 75, NULL, ''2011-07-29 04:10:07'', ''2011-07-11 07:27:12'', ''2011-07-29 04:10:07'', ''2011-07-21 07:02:14'', 20, NULL, NULL, 45, 6, ''''), (4, 43, 78, NULL, ''2011-07-18 03:32:27'', ''2011-07-11 07:51:31'', ''2011-07-13 02:18:34'', ''2011-07-21 07:37:53'', 20, NULL, NULL, 45, 6, ''''), (5, 43, 76, NULL, ''2011-07-29 04:09:19'', ''2011-07-11 07:51:11'', ''2011-07-29 04:09:19'', ''2011-07-21 07:38:30'', 20, NULL, NULL, 45, 6, ''''), (6, 43, 77, NULL, ''2011-07-18 03:32:49'', ''2011-07-11 07:51:34'', ''2011-07-18 02:18:46'', ''2011-07-21 07:39:00'', 20, NULL, NULL, 45, 6, ''''), (7, 43, 79, NULL, ''2011-07-18 03:33:02'', ''2011-07-11 07:53:24'', ''2011-07-18 01:50:12'', ''2011-07-21 07:42:57'', 20, NULL, NULL, 45, 6, ''''), (8, 43, 80, NULL, ''2011-07-29 04:10:38'', ''2011-07-11 07:53:58'', ''2011-07-29 04:10:38'', ''2011-07-21 07:43:14'', 20, NULL, NULL, 45, 6, ''''), (9, 43, 81, NULL, ''2011-07-18 03:31:54'', ''2011-07-11 07:53:49'', ''2011-07-13 02:17:02'', ''2011-07-21 07:43:43'', 20, NULL, NULL, 45, 6, ''''), (11, 43, 88, NULL, ''2011-07-18 03:15:53'', ''2011-07-13 04:57:38'', ''2011-07-15 08:57:15'', ''2011-07-23 04:39:14'', 12, NULL, NULL, 44, 6, ''''), (13, 43, 90, NULL, ''2011-07-26 07:39:24'', ''2011-07-13 12:16:48'', ''2011-07-26 07:39:24'', ''2011-07-23 12:13:50'', 15, NULL, NULL, 51, 6, ''''), (63, 43, 176, NULL, ''2011-09-13 08:23:13'', ''2011-08-26 10:00:32'', ''2011-09-13 08:23:13'', ''2011-09-05 09:58:47'', 41, NULL, NULL, 45, 6, ''''), (62, 43, 174, NULL, ''2011-08-24 03:54:30'', ''2011-08-24 03:53:13'', ''2011-08-24 03:54:30'', ''2011-08-29 03:52:48'', 17, NULL, NULL, 51, 6, ''''), (61, 43, 173, NULL, ''2011-08-24 03:55:05'', ''2011-08-24 03:53:39'', ''2011-08-24 03:55:05'', ''2011-08-29 03:52:36'', 17, NULL, NULL, 51, 6, ''''), (60, 43, 172, NULL, ''2011-08-24 03:22:41'', ''2011-08-24 03:21:50'', ''2011-08-24 03:22:41'', ''2011-08-29 03:21:11'', 17, NULL, NULL, 51, 6, ''''), (59, 43, 171, NULL, ''2011-08-24 03:23:19'', ''2011-08-24 03:22:00'', ''2011-08-24 03:23:19'', ''2011-08-29 03:20:57'', 17, NULL, NULL, 51, 6, '''');


Cree una tabla que contenga todos los fines de semana y días festivos para los próximos 100 años cualquiera.

Debe poder especificar cuándo un día es un "día festivo", ya que nadie sabe cuáles serán las vacaciones para 2052, sin embargo, no podrá realizar una función precisa en este momento. solo actualice su tabla de días no laborales cada año cuando se conozcan los días festivos (pero siempre sabrá los fines de semana).

Entonces su consulta se convierte en:

SELECT DATEFIFF(end_date, start_date) - COALESCE((SELECT COUNT(1) FROM nonWorkDays WHERE nonWorkDays.date BETWEEN start_date AND end_date), 0) FROM accounts

Si realmente necesita escribir una función DATEDIFFWITHOUTWEEKENDSORHOLIDAYS , simplemente use la anterior y cree una función (hay muchos recursos sobre cómo hacer funciones en cada RDBMS). Asegúrese de darle un mejor nombre. ^ _ ^

Una cosa que deberá corregir es que creo que falta un +1 en alguna parte de lo anterior, por ejemplo, DATEDIFF (hoy, hoy) si hoy es un fin de semana, devolverá -1 en lugar de devolver 0.


Es posible que desee probar esto:

  1. Cuente el número de días laborables (lo tomó de here )

    SELECT 5 * (DATEDIFF(''2012-12-31'', ''2012-01-01'') DIV 7) + MID(''0123444401233334012222340111123400012345001234550'', 7 * WEEKDAY(''2012-01-01'') + WEEKDAY(''2012-12-31'') + 1, 1)

    Esto te da 261 días hábiles para el 2012.

  2. Ahora necesitas conocer tus vacaciones que no son un fin de semana.

    SELECT COUNT(*) FROM holidays WHERE DAYOFWEEK(holiday) < 6

    El resultado de esto depende de su mesa de vacaciones.

  3. Necesitamos obtener eso en una consulta:

    SELECT 5 * (DATEDIFF(''2012-12-31'', ''2012-01-01'') DIV 7) + MID(''0123444401233334012222340111123400012345001234550'', 7 * WEEKDAY(''2012-01-01'') + WEEKDAY(''2012-12-31'') + 1, 1) - (SELECT COUNT(*) FROM holidays WHERE DAYOFWEEK(holiday) < 6)

    Esto debería ser.

Editar: tenga en cuenta que esto solo funciona correctamente si su fecha de finalización es superior a la fecha de inicio.


Haz una función que haga un ciclo de tiempo entre las fechas incrementando la cantidad de días cuando no sea sábado o domingo.


Prueba este Código, esto calculará el número de días Excluyendo fines de semana

SELECT (DATEDIFF(dd, @StartDate, @EndDate)+1) -(DATEDIFF(wk, @StartDate, @EndDate) * 2) from test_tbl where date NOT IN (SELECT date FROM holidaydatestable )