SQL Funkcja czasu dodająca nowy rekord w zapytaniu

0

Cześć, na wstępie chce powiedzieć że jestem SQL-owym słabeuszem.

Chce przygotować raport/tabelę analizująca czas pracy. Podstawą do analiz jest praca na dany dzień od 0:00:00 do 23:59:59.
W tabeli jak niżej występują sytuacje gdy pracownik jest na nocce. i Tu poległem

Czy ma ktoś jakis pomysł jak załatwić SQLem tak aby zawartośc tabeli przekształcić na druga z polem FIXED??
Tych rekordów rocznie jest 85 tysięcy.

screenshot-20200608155728.png

Czas w polach wyliczanych zrobiłem tak:

cast(datepart(hour, (D.date_to_accepted - D.date_from_accepted)) as varchar(2))+':'+cast(datepart(MI, (D.date_to_accepted - D.date_from_accepted)) as varchar(2))+':'+cast(datepart(SS, (D.date_to_accepted - D.date_from_accepted)) as varchar(2)) as time_accepted_hour_minutes,
cast(datepart(hour, (D.date_to - D.date_from)) as varchar(2))+':'+cast(datepart(MI, (D.date_to - D.date_from)) as varchar(2))+':'+cast(datepart(SS, (D.date_to - D.date_from)) as varchar(2)) as time_from_system_hour_minutes
0

Czyli potrzebujesz sekwencji czasowej - taki ciąg dni? Jakiej bazy uzwyasz?

0

Spróbuj skonwertować datę początkową i końcową do liczby np. sekundy, wtedy prostym matematycznym działaniem jak odejmowanie wyliczysz sobie sekundy/minuty/godziny ;-)

ewentualnie datediff

https://www.w3schools.com/sql/func_sqlserver_datediff.asp

A jak chcesz otrzymać w jakimś konkretnym formacie datę to używasz:
SELECT FORMAT(zmienna_z_datą, 'yyyy-MM-dd')

0

Muszę otwarcie powiedzieć że nieprogramista, słabeusz SQLowy zabieram się za takie coś....

Tomek Pycia napisał(a):

Czyli potrzebujesz sekwencji czasowej - taki ciąg dni? Jakiej bazy uzwyasz?

Używam SQL Server Standard
Co do pierwszego pytania nie potrafię na nie odpowiedzieć. [wstyd]

Damian Korczowski napisał(a):

Spróbuj skonwertować datę początkową i końcową do liczby np. sekundy, wtedy prostym matematycznym działaniem jak odejmowanie wyliczysz sobie sekundy/minuty/godziny ;-)

ewentualnie datediff

https://www.w3schools.com/sql/func_sqlserver_datediff.asp

A jak chcesz otrzymać w jakimś konkretnym formacie datę to używasz:
SELECT FORMAT(zmienna_z_datą, 'yyyy-MM-dd')

Potrafię zliczyć minuty datediff i datepartem, ale jak złapać taki case jak na screenach.
W jednym rekordzie mam informację o de facto dwóch dniach i chciałbym "rozbić" ten czas wyliczony datediffem na dwa rekordy. Pierwszy ten z czasem pracy do północy i drugi po północy. Mogę to wszystko lepić w Excelu i PowerPivocie ale może ktoś z Was ma pomysł jak to sprytnie pętlą załatwić albo jakimś innym prostym patentem w T-SQL.

1

sposobów jest klika, możesz napisać funkcje, która zwróci Ci tabele z 2 rekordami dla 2 różnych dat i jednym dla takich samych:

CREATE FUNCTION udfdates(@from datetime, @to datetime)
    RETURNS @dt TABLE (
        date_fixed datetime
    )
AS
BEGIN
    INSERT INTO @dt values (@from)
    IF datediff(d,@from,@to) > 0 INSERT INTO @dt values (@to)
	Return
END;

I później Cross apply

select * from tabela
cross apply dbo.udfdates(date_from,date_to)

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