Calculate working shift giving current datetime in sybase

594 views Asked by At

I need a sql script in sybase or at least ansi sql that giving the current datetime, i can get the current working shift.

  • Working shift '1' begins at 08:00 and ends at 15:30
  • Working shift '2' begins at 15:30 and ends at 23:00
  • Working shift '3' begins at 23:00 and ends at 08:00AM of the next day

I am having trouble with the third shift, because of the change between one day and next day

SET  @FechaActual = convert(datetime, 'JUN 11 2015 11:00AM', 100) --getdate()

SET @HoraComienzoTurno1 = convert(datetime,convert(varchar, @FechaActual, 101) + " 08:00:00 AM")
SET @HoraFinTurno1 = convert(datetime,convert(varchar, @FechaActual, 101) + " 03:29:59 PM")
SET @HoraComienzoTurno2 = convert(datetime,convert(varchar, @FechaActual, 101) + " 03:30:00 PM")
SET @HoraFinTurno2 = convert(datetime,convert(varchar, @FechaActual, 101) + " 10:59:59 PM")
SET @HoraComienzoTurno3 = convert(datetime,convert(varchar, @FechaActual, 101) + " 11:00:00 PM")
SET @HoraFinTurno3 = convert(datetime,convert(varchar, @FechaActual, 101) + " 07:59:59 AM")

IF @FechaActual >= @HoraComienzoTurno1 AND @FechaActual <= @HoraFinTurno1
BEGIN
    SELECT 1 AS Turno, @FechaActual AS FechaActual
END

IF @FechaActual >= @HoraComienzoTurno2 AND @FechaActual <= @HoraFinTurno2 
BEGIN
    SELECT 2 AS Turno, @FechaActual AS FechaActual
END

IF @FechaActual >= @HoraComienzoTurno3 AND @FechaActual <= @HoraFinTurno3 
BEGIN
    SELECT 3 AS Turno, dateadd(dd, -1, @FechaActual) AS FechaActual
END
2

There are 2 answers

1
Alejandro Teixeira Muñoz On BEST ANSWER

I have no sybase here, then cannot try it. I think what you need is datepart function. This function only gets the hours, or minutes from the datetime value, then you will be able to easily check without thinking in days.

I did the following changes:

  • I changed the code to show how it works (maybe my spelling is not right)

  • I changed the last condition to be an OR, because it´s impossible for the last shift worker, to have an hour > 23 and < 9 at the same time ;-)

Hope it may help you. (sorry if it doesn´t compile, but it´s a few years since I don´t play with sybase).

SET  @FechaActual = datepart("hhmi",convert(datetime, 'JUN 11 2015 11:00AM', 100))

SET @HoraComienzoTurno1 = datepart("hhmi",convert(datetime,convert(varchar, @FechaActual, 101) + " 08:00:00 AM"))
SET @HoraFinTurno1 = datepart("hhmi",convert(datetime,convert(varchar, @FechaActual, 101) + " 03:29:59 PM"))
SET @HoraComienzoTurno2 = datepart("hhmi",convert(datetime,convert(varchar, @FechaActual, 101) + " 03:30:00 PM"))
SET @HoraFinTurno2 = datepart("hhmi",convert(datetime,convert(varchar, @FechaActual, 101) + " 10:59:59 PM"))
SET @HoraComienzoTurno3 = datepart("hhmi",convert(datetime,convert(varchar, @FechaActual, 101) + " 11:00:00 PM"))
SET @HoraFinTurno3 = datepart("hhmi",convert(datetime,convert(varchar, @FechaActual, 101) + " 07:59:59 AM"))

IF @FechaActual >= @HoraComienzoTurno1 AND @FechaActual <= @HoraFinTurno1
BEGIN
    SELECT 1 AS Turno, @FechaActual AS FechaActual
END

IF @FechaActual >= @HoraComienzoTurno2 AND @FechaActual <= @HoraFinTurno2 
BEGIN
    SELECT 2 AS Turno, @FechaActual AS FechaActual
END

IF @FechaActual >= @HoraComienzoTurno3 OR @FechaActual <= @HoraFinTurno3 
BEGIN
    SELECT 3 AS Turno, dateadd(dd, -1, @FechaActual) AS FechaActual
END

EDIT Added "mi" to datepart() pattern, to manage also minutes

0
Herman Zun On

This is a working code, a bit messy but i'm trying to clean it up.

  • I had to substract a day to shift 3 start if actual date is past 12AM
  • Else add a day to shift 3 end
SET @FechaActual = getdate() --convert(datetime, 'JUN 12 2015 12:59:00AM', 100)
--Se toma la fecha actual, se convierte a varchar, se concatena la hora y se convierte a datetime nuevamente
SET @HoraComienzoTurno1 = convert(datetime,convert(varchar, @FechaActual, 101) + " 08:00:00 AM")
SET @HoraFinTurno1 = convert(datetime,convert(varchar, @FechaActual, 101) + " 03:29:59 PM")
SET @HoraComienzoTurno2 = convert(datetime,convert(varchar, @FechaActual, 101) + " 03:30:00 PM")
SET @HoraFinTurno2 = convert(datetime,convert(varchar, @FechaActual, 101) + " 10:59:59 PM")

--Si son pasada las 12:00AM del turno 3, la fecha de comienzo de turno debe ser un dia antes, en caso contrario el fin de turno debe ser al dia siguiente
IF @FechaActual >= convert(datetime,convert(varchar, @FechaActual, 101) + " 12:00:00 AM") AND @FechaActual <= convert(datetime,convert(varchar, @FechaActual, 101) + " 07:59:59 AM")
BEGIN

        SET @FechaActualTurno3 = dateadd(dd, -1, @FechaActual)
        SET @HoraComienzoTurno3 = dateadd(dd, -1, convert(datetime,convert(varchar, @FechaActual, 101) + " 11:00:00 PM"))
        SET @HoraFinTurno3 = convert(datetime,convert(varchar, @FechaActual, 101) + " 07:59:59 AM")
END
ELSE
BEGIN
        SET @FechaActualTurno3 = @FechaActual
        SET @HoraComienzoTurno3 = convert(datetime,convert(varchar, @FechaActual, 101) + " 11:00:00 PM")
        SET @HoraFinTurno3 = dateadd(dd, 1, convert(datetime,convert(varchar, @FechaActual, 101) + " 07:59:59 AM"))
END

--Condiciones
IF @FechaActual >= @HoraComienzoTurno1 AND @FechaActual <= @HoraFinTurno1
BEGIN
    SELECT 1 AS Turno, convert(varchar, @FechaActual, 103) AS FechaActual
END

IF @FechaActual >= @HoraComienzoTurno2 AND @FechaActual <= @HoraFinTurno2 
BEGIN
    SELECT 2 AS Turno, convert(varchar, @FechaActual, 103) AS FechaActual
END

IF @FechaActual >= @HoraComienzoTurno3 AND @FechaActual <= @HoraFinTurno3 
BEGIN
    SELECT 3 AS Turno, convert(varchar, @FechaActualTurno3, 103) AS FechaActual
END