在sybase中计算给出当前日期时间的工作班次
Calculate working shift giving current datetime in sybase
我需要 sybase 中的 sql 脚本或至少 ansi sql 提供当前日期时间,我可以获得当前工作班次。
- 工作班次“1”从 08:00 开始到 15:30
结束
- 工作班次“2”开始于 15:30,结束于 23:00
- 工作班次“3”从 23:00 开始,到第二天 08:00AM 结束
我遇到了第三班的问题,因为一天和第二天之间的变化
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
我需要 sybase 中的 sql 脚本或至少 ansi sql 提供当前日期时间,我可以获得当前工作班次。
- 工作班次“1”从 08:00 开始到 15:30 结束
- 工作班次“2”开始于 15:30,结束于 23:00
- 工作班次“3”从 23:00 开始,到第二天 08:00AM 结束
我遇到了第三班的问题,因为一天和第二天之间的变化
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