SQL- podział dnia na II zmiany

0

Cześć, mam bazę sql z której tworzę raport o Produjcji,
pomiary w bazie są co 1 min. od włączenia maszyny rano, aż do jej wyłączenia
używając zapytania:

            SELECT
	DATEADD(HOUR, DATEDIFF (HOUR, 0, WorkDateTime), 0  ) as CZAS, SUM(Weight) AS PRODUKCJA   
			
	FROM[dbo].[vwConveyorScaleMinute] 
	WHERE VehicleId = 8  
	AND WorkDateTime BETWEEN '2021-09-16 01:00:00.000' AND '2021-09-16 23:00:00.000' 
	GROUP BY dateadd(HOUR, datediff(HOUR, 0, WorkDateTime), 0) 
	ORDER BY dateadd(HOUR, datediff(HOUR, 0, WorkDateTime), 0) ;

screenshot-20211022111517.png

Tworze raport godziny, czy tez dzienny, z tym nie mam problemu
czy może mi ktoś pomóc aby wygenerować zapytanie zwracające I zmianę i II zmianę ?
zakładając, że I zmiana pracuje od 6:00 do 14:00 a II zmiana 14:00 do 22:00
osiągając podobny efekt:
screenshot-20211022113046.png

4
With r as (
   SELECT
    DATEADD(HOUR, DATEDIFF (HOUR, 0, WorkDateTime), 0  ) as CZAS, SUM(Weight) AS PRODUKCJA   

    FROM[dbo].[vwConveyorScaleMinute] 
    WHERE VehicleId = 8  
    AND WorkDateTime BETWEEN '2021-09-16 01:00:00.000' AND '2021-09-16 23:00:00.000' 
    GROUP BY dateadd(HOUR, datediff(HOUR, 0, WorkDateTime), 0) 
)
Select
    cast(czas as date) czas,
    sum(case when DATEPART(HOUR,czas) between 6 and 13 then produkcja else 0 end) [I zmiana],
    sum(case when DATEPART(HOUR,czas) between 6 and 13 then 0  else produkcja end) [II zmiana],
    sum(produkcja) [Razem]
from
   r
group by 
      cast(czas as date)

lub

With r as (
   SELECT
    DATEADD(HOUR, DATEDIFF (HOUR, 0, WorkDateTime), 0  ) as CZAS, SUM(Weight) AS PRODUKCJA   

    FROM[dbo].[vwConveyorScaleMinute] 
    WHERE VehicleId = 8  
    AND WorkDateTime BETWEEN '2021-09-16 01:00:00.000' AND '2021-09-16 23:00:00.000' 
    GROUP BY dateadd(HOUR, datediff(HOUR, 0, WorkDateTime), 0) 
)
Select
    cast(czas as date) czas,
    case when DATEPART(HOUR,czas) between 6 and 13 then 'I zmiana' else 'II Zmiana' end [Zmiana],
    sum(produkcja) [Produkcja]
from
   r
group by 
      cast(czas as date),
     case when DATEPART(HOUR,czas) between 6 and 13 then 'I zmiana' else 'II Zmiana' end
0

@Panczo: G**enialne **
teraz pytanie jak zmodyfikować 2 przykład dla dni miesiaca gdyż, najpierw liczy wszytkie I zmiany a później dopiero II
a chciałbym aby liczyl dla 1 dnia I i II zmiane i nastepnie kolejny dzień

2

Zwraca w kolejności grupowania, jak liczy to juz wie tylko silnik,

Więc musisz dodac:

ORDER BY
    cast(czas as date),
    case when DATEPART(HOUR,czas) between 6 and 13 then 0 else 1 end,
0

Już działa tak jak chciałem i wyświetla dni i zmiany chronologicznie
wielkie DZIĘKI @Panczo

With r as (
SELECT
DATEADD(HOUR, DATEDIFF (HOUR, 0, WorkDateTime), 0 ) as CZAS, SUM(Weight) AS PRODUKCJA
FROM[dbo].[vwConveyorScaleMinute]
WHERE VehicleId = 8
AND WorkDateTime BETWEEN '2021-09-01 0100.000' AND '2021-09-30 2300.000'
GROUP BY dateadd(HOUR, datediff(HOUR, 0, WorkDateTime), 0)
)
Select
cast(czas as date) czas,
case when DATEPART(HOUR,czas) between 6 and 13 then 'I zmiana' else 'II Zmiana' end [Zmiana],
sum(produkcja) [Produkcja]
from r
group by
cast(czas as date),
case when DATEPART(HOUR,czas) between 6 and 13 then 'I zmiana' else 'II Zmiana' end,
case when DATEPART(HOUR,czas) between 6 and 13 then 0 else 1 end

0

Panowie uzyta funkcja DATEADD ( datepart, liczba, data ) gdzie datepart:
screenshot-20211102131545.png

przedziały czasowe godz, dni czy tygodnie to nie problem, teraz problem pojawia się jak mamy zrobić przedziął czasowy np 30 minutowy czy 15 min ?

Wiecie jak to przekształcić lub jakiej innej funkcji użyć aby przedstawić to właśnie w tych przedziałach czasowych ?

0

W czym problem wyciągasz minute z daty i na jej podstawie sprawdzasz wktórej tam połwce czy ćwiartce godziny jesteś.

0

W sensie gdy mamy interwał 1 h
screenshot-20211103095608.png

screenshot-20211103095433.png

a chce to zrobić aby interwał był 15 minutiwy lub 30 minutowy, i niemogę sobie z tym poradzić

0

Analizowałem także to rozwiązanie lecz wynik był kiepski, pewnie na wzgląd na moje umiejetności , dlatego pisze na forum o pomoc gdyż męcze się już z tym kilkanaście godzi

Odpowiadaj w wątku.

co to znaczy wynik był kiepski:

selec select cast( 
         FLOOR( cast( czas as float)*(24*4)) / (24*4) 
       as smalldatetime) AS "datetime_quarter"
From
  r

zokrągli godzinę do pełnego kwadransa, to czego oczekujesz?

0

@Panczo:
SELECT
CAST (FLOOR ( CAST (GETDATE() AS FLOAT)(244)) (244)
AS smalldatetime) AS datetime_quarter,
SUM(Weight) AS PRODUKCJA

FROM [TMSCLIENT4].[dbo].[vwConveyorScaleMinute]
WHERE VehicleId = 10
AND WorkDateTime BETWEEN '2021-09-16 010000.000' AND '2021-09-16 073000.000'

daje efekt przykładowo dla produkcji gdzie datę wpisuje aktualną a powinna być z przedziału czasowego

screenshot-20211103105232.png
a chce uzyskac efekt :
screenshot-20211103105456.png

zdaje sobie sprawe że dla kogoś kto dobrze zna sql to są pytania trywialne, lecz na poczatku mojej nauki sqla sprawia mi to duży problem

0

A nie wpadłes na to by zastąpić GETDATE() w tym zapytaniu?
Bo ja w poście wyżej użyłem kolumny czas ty natomiast wstawiasz bieżący czas z funkcji getddate...
Chyba trzeba by wstawić WorkDateTime

0

@Panczo: mam nadzieje że to ostatnie moje pytanie w tej kwestii
screenshot-20211103114006.png
ja widać mam przedział czasowy 15 min teraz pytanie jak to szybko i sprawnie zrobic aby zliczał, całą produkcje w tym czasie np od 7:00 do 7:15 i tak co 15 min przez cały dzień ?

1

Jeżeli zaokrąglasz do tych kwadransów:

With r as (
   SELECT
		cast(FLOOR(cast(WorkDateTime as float)*(24*4)) / (24*4) as smalldatetime) AS CZAS
		, Weight AS PRODUKCJA   
	FROM
		[dbo].[vwConveyorScaleMinute] 
    WHERE 
		VehicleId = 8  
		AND WorkDateTime BETWEEN '2021-09-16 01:00:00.000' AND '2021-09-16 23:00:00.000' 
    
)
Select
   czas,
    sum(produkcja) [Produkcja]
from
   r
group by 
CZAS

1 użytkowników online, w tym zalogowanych: 0, gości: 1