Przejdź do głównej zawartości

Zamiana daty i czasu na data-czas

Kolejne szkolenie u klienta i kolejne wyzwanie za mną...

Chodziło o wygenerowanie raportu czasu pracy z uwzględnieniem, że zmiana następuje o godz. 6:00 a nie o północy.
To znaczy, że godziny do 6:00 powinny być jeszcze zaliczane do dnia poprzedniego.

Dodatkowym utrudnieniem u klienta był fakt, że data w bazie danych była rozbita na 2 pola:

  • data w formacie: yyyy-mm-dd 00:00:00
  • godzina w formacie: 1900-01-01 HH:mm

W takim razie do dzieła!

Załóżmy, że mamy następującą tabelę:

CREATE TABLE [dbo].[WorkItems](
[WorkItemId] [int] IDENTITY(1,1) NOT NULL,
[BeginDate] [datetime] NOT NULL,
[BeginTime] [datetime] NOT NULL,
[Person] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_WorkItems] PRIMARY KEY CLUSTERED
(
[WorkItemId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[WorkItems] ON
GO
INSERT [dbo].[WorkItems] ([WorkItemId], [BeginDate], [BeginTime], [Person]) VALUES (1, CAST(N'2017-04-01T00:00:00.000' AS DateTime), CAST(N'1900-01-01T04:30:00.000' AS DateTime), N'Marcin Sulecki')
GO
INSERT [dbo].[WorkItems] ([WorkItemId], [BeginDate], [BeginTime], [Person]) VALUES (2, CAST(N'2017-04-01T00:00:00.000' AS DateTime), CAST(N'1900-01-01T06:40:00.000' AS DateTime), N'John Smith')
GO
INSERT [dbo].[WorkItems] ([WorkItemId], [BeginDate], [BeginTime], [Person]) VALUES (3, CAST(N'2017-03-31T00:00:00.000' AS DateTime), CAST(N'1900-01-01T23:00:00.000' AS DateTime), N'Ann Crystal')
GO
INSERT [dbo].[WorkItems] ([WorkItemId], [BeginDate], [BeginTime], [Person]) VALUES (4, CAST(N'2017-03-31T00:00:00.000' AS DateTime), CAST(N'1900-01-01T14:00:00.000' AS DateTime), N'Marcin Sulecki')
GO
SET IDENTITY_INSERT [dbo].[WorkItems] OFF
GO
view raw cr-datetime.sql hosted with ❤ by GitHub

1. Tworzymy formułę która zamieni 2 osobne pola z datą i czasem w jedno pole typu datetime:

// Konwersja daty i czasu na datetime
datetime(date({WorkItems.BeginDate}),time({WorkItems.BeginTime}))
W ten sposób otrzymamy jedną wartość w formacie yyyy-mm-dd HH:mm

2. Następnie od tak utworzonej daty odejmujemy 6 godzin:

// Przesunięcie czasu o 6 godzin.
date(dateadd('h', -6, {@BeginDateTime}))
view raw cr-dateadd hosted with ❤ by GitHub

Otrzymamy w rezultacie coś takiego: Kolumna WorkDate wyświetla datę do której została zakwalifikowana pozycja.

Na podstawie tak utworzonej formuły można utworzyć grupowanie na raporcie.

Komentarze

Popularne posty z tego bloga

Konwersja daty w CDN Optima

Crystal Reports jest bardzo często zintegrowany z popularnymi aplikacjami. Przykładem jest system CDN Optima . Początkujących użytkownikom sprawiają kolumny z datą, bo data nie jest zapisana jako datetime lecz jako liczba. Otóż data w CDN Optima zapisana jest w formacie Clarion, czyli liczba dni, które upłynęły od daty 1800-12-28 . (Czy ktoś wie co to za data w historii?) Dlatego jeśli chcemy użyć takiego pola na raporcie, pierwsze co powinniśmy zrobić to dokonać konwersji liczby na datę. W innym przypadku Crystal Reports nie będzie wiedział, że jest to data i żadne formatowanie dat, grupowanie po okresach nie będzie działać. Formuła do konwersji formatu Clarion na datę : Jeśli mamy wiele takich pól to najlepiej utworzyć własną funkcję:

Funkcje Crystal Reports

Crystal Reports posiada bardzo dużo funkcji (ok. 200) do operacji na tekstach, liczbach, datach itd. Można się z nimi zapoznać przeglądając drzewo Funkcje (Functions) w Edytorze Formuł (Formula Editor) i czytając helpa. Warto je znać, aby nie wyważać otwartych drzwi.  Problem w tym, że trzeba wiedzieć czego się szuka.   Dla wielu osób dodatkową barierą może być język angielski, bo nawet w polskiej wersji Crystala, help, o przepraszam.... pomoc jest w języku Szekspira. Dlatego stworzyłem niegdyś listę funkcji Crystal Reports w języku polskim, którą otrzymywali uczestnicy moich szkoleń w formacie PDF.  Teraz postanowiłem  opublikować ją w sieci, aby była zawsze była pod ręką i dostępna dla szerszego grona.  Lista funkcja dostępna jest tutaj . Lista funkcji nie jest jeszcze w pełni kompletna, więc będę ją na bieżąco aktualizować. Czekam na wasze komentarze i uwagi, zwłaszcza propozycje lepszych tłumaczeń. Miłego korzystania!