在sybase中计算给出当前日期时间的工作班次

Calculate working shift giving current datetime in sybase

我需要 sybase 中的 sql 脚本或至少 ansi sql 提供当前日期时间,我可以获得当前工作班次。

我遇到了第三班的问题,因为一天和第二天之间的变化

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

我这里没有sybase,不能试。我想你需要的是datepart function。此函数仅从日期时间值中获取小时或分钟,然后您将可以在几天内不假思索地轻松检查。

我做了以下更改:

  • 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 ;-)

希望对您有所帮助。 (抱歉,如果它不能编译,但我已经有几年没玩 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

这是一个工作代码,有点乱,但我正在努力清理它。

  • 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