Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [SQL Express] calcolo disponibilit� totale di tempo

    Buongiorno,
    ho una tabella (My_Shifts) di questo tipo:

    ShiftNum / ShiftWeekday / ShiftStartHH/ ShiftDuration / ShiftDescr /ShiftActive/ ShiftEndNextDay
    1 1 7 480 Turno 1 True False
    1 2 7 480 Turno 1 True False
    1 3 7 480 Turno 1 True False
    1 4 7 480 Turno 1 True False
    1 5 7 480 Turno 1 True False
    1 6 7 480 Turno 1 True False
    1 7 7 480 Turno 3 True False
    2 1 15 480 Turno 2 True False
    2 2 15 480 Turno 2 True False
    2 3 15 480 Turno 2 True False
    2 4 15 480 Turno 2 True False
    2 5 15 480 Turno 2 True False
    2 6 15 480 Turno 2 True False
    2 7 15 480 Turno 3 False False
    3 1 23 480 Turno 3 False True
    3 2 23 480 Turno 3 False True
    3 3 23 480 Turno 3 False True
    3 4 23 480 Turno 3 False True
    3 5 23 480 Turno 3 False True
    3 6 23 480 Turno 3 False True
    3 7 23 480 Turno 3 False True

    Sostanzialmente mostra i turni attivi nella giornata (flag Attivo) con ora inizio e durata per ogni giorno della settimana. Qui ad esempio lavorano tutti i giorni su due turni dalle 7-15 e 15-23
    L'operatore inserir� a terminale una dataora inizio e dataora fine e devo estrarre il totale dei minuti disponibili.
    Esempio:
    dal 20/02/2017 07:00 al 21/02/2017 07:00 = 960 minuti disponibili

    Avete qualche idea?

    Io mi sono fatto una tabella mycalendar con tutti i gg dell'anno e poi ho fatto questa query:

    SELECT (CASE WHEN DATEPART(dw, '27/02/2017') <> 7 THEN SUM(ShiftDurationMinutes) - DATEDIFF(minute, '20/02/2017 00:00:00', '20/02/2017 7:00:00') - - DATEDIFF(minute, '28/02/2017 00:00:00', '27/02/2017 7:00:00')
    ELSE SUM(ShiftDurationMinutes) - DATEDIFF(minute, '20/02/2017 00:00:00', '20/02/2017 7:00:00') - 60 END) AS ShiftDurationTot
    FROM (SELECT CONVERT(char(10), A.LocalTimeCol, 103) AS Day, dbo.My_Shifts.ShiftDurationMinutes
    FROM dbo.My_Calendar AS A INNER JOIN
    dbo.My_Shifts ON DATEPART(dw, A.LocalTimeCol) = dbo.My_Shifts.ShiftWeekday
    WHERE (A.LocalTimeCol >= '20/02/2017 00:00:00') AND (A.LocalTimeCol <= '27/02/2017 00:00:00') AND (dbo.My_Shifts.ShiftActive = 1)
    GROUP BY CONVERT(char(10), A.LocalTimeCol, 103), dbo.My_Shifts.ShiftNum, dbo.My_Shifts.ShiftDurationMinutes) AS B

    Ma ha qualche buco.... in pi� forse si fa senza fare una ulteriore tabella.

    Grazie per ogni eventuale aiuto e consiglio!

  2. #2
    Cos� sembra funzionare, qualcuno suggerisce qualcosa di meglio?

    SELECT (SUM(B.ShiftDurationMinutes) - DATEDIFF(minute, '1/02/2017 00:00:00', '1/02/2017 7:00:00') - - DATEDIFF(minute, '1/03/2017 00:00:00', '28/02/2017 23:00:00')) + (1440 - MAX(C.ShiftDurationLastDay))
    AS ShiftDurationTot
    FROM (SELECT CONVERT(char(10), A.LocalTimeCol, 103) AS Day, dbo.My_Shifts.ShiftDurationMinutes
    FROM dbo.My_Calendar AS A INNER JOIN
    dbo.My_Shifts ON DATEPART(dw, A.LocalTimeCol) = dbo.My_Shifts.ShiftWeekday
    WHERE (A.LocalTimeCol >= '1/02/2017 00:00:00') AND (A.LocalTimeCol <= '28/02/2017 00:00:00') AND (dbo.My_Shifts.ShiftActive = 1) GROUP BY CONVERT(char(10), A.LocalTimeCol, 103), dbo.My_Shifts.ShiftNum, dbo.My_Shifts.ShiftDurationMinutes) AS B CROSS JOIN
    (SELECT SUM(My_Shifts_1.ShiftDurationMinutes) AS ShiftDurationLastDay
    FROM dbo.My_Calendar AS A INNER JOIN
    dbo.My_Shifts AS My_Shifts_1 ON DATEPART(dw, A.LocalTimeCol) = My_Shifts_1.ShiftWeekday
    WHERE (A.LocalTimeCol = '28/02/2017 00:00:00') AND (My_Shifts_1.ShiftActive = 1)) AS C

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.