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 |
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})) |
2. Następnie od tak utworzonej daty odejmujemy 6 godzin:
// Przesunięcie czasu o 6 godzin. | |
date(dateadd('h', -6, {@BeginDateTime})) |
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