Это работает для предоставленных вами образцов данных. Примечание однако я предполагаю , что recordDate
является varchar
, поскольку оно не является действительным значением datetime
(если бы оно было, 2019-05-07 00:00:00 000
было бы 2019-05-07 00:00:00.000
; обратите внимание на .
вместо
). Если recordDate
не является varchar
, то вам не нужно будет включать выражения STUFF
и CONVERT
, чтобы "исправить" значение в операторе VALUES
. Однако на самом деле вы не должны хранить данные date(time)
как varchar
; используйте соответствующий тип данных для ваших данных (так как эти значения не имеют временной части, кроме полуночи, date
может показаться наилучшим).
Я также возвращаю столбцы TimeIn
и TimeOut
в качестве типа данных time
. Типы данных Дата и Время в SQL Server не имеют формата, они являются двоичными значениями. Если вы хотите отобразить его в 12-часовом формате, вам необходимо настроить его на уровне представления, а не на SQL:
--Table1 Sample Data
WITH Table1 AS(
SELECT V.Entries,
V.recordDate,
V.Empid,
V.Reference
FROM (VALUES('0016930507201907:35I','2019-05-07 00:00:00 000','001693',1693),
('0016930507201917:06O','2019-05-07 00:00:00 000','001693',1693),
('0016930507201907:35I','2019-05-08 00:00:00 000','001693',1693),
(NULL,'2019-05-08 00:00:00 000','001693',1693)) V(Entries,recordDate,Empid,Reference)),
--Table2 Sample Data
Table2 AS (
SELECT 'Cruz' AS LastName,
'MA Kimberly' AS FirstName,
'Castillo' AS middleName,
'001693' AS EmployeeNO)
--Solution
SELECT STUFF(CONCAT(', ' + T2.LastName, ', ' + T2.FirstName, ', ' + T2.middleName),1,2,'') AS [Name],
T2.EmployeeNO,
T1.recordDate,
MAX(CONVERT(time(0),CASE S.InOut WHEN 'I' THEN SUBSTRING(T1.Entries,15,5) END)) AS TimeIn,
MAX(CONVERT(time(0),CASE S.InOut WHEN 'O' THEN SUBSTRING(T1.Entries,15,5) END)) AS TimeOut
FROM Table1 T1
JOIN Table2 T2 ON T1.Empid = T2.EmployeeNO --These should really have the same name
CROSS APPLY(VALUES(CONVERT(datetime,STUFF(STUFF(T1.recordDate,11,1, 'T'),20,1,'.')),RIGHT(T1.Entries,1))) S(recordDate, InOut)
GROUP BY T2.EmployeeNO,
T1.recordDate,
T2.LastName,
T2.FirstName,
T2.middleName;