Это должно работать
ALTER PROCEDURE [hrms].[GET_ATTENDANCEREPORT]
@STARTDATE DATE
,@ENDDATE DATE
AS
BEGIN
WITH
[DATERANGE]
AS
(
SELECT
[DT] = DATEADD(DD, 0, @STARTDATE)
WHERE DATEADD(DD, 1, @STARTDATE) <= @ENDDATE
UNION ALL
SELECT
DATEADD(DD, 1, [DATERANGE].[DT])
FROM
[DATERANGE]
WHERE DATEADD(DD, 1, [DATERANGE].[DT]) <= @ENDDATE
)
SELECT
[DATERANGE].[DT]
INTO
[#TMP_DATES]
FROM
[DATERANGE]
DECLARE @COLUMN VARCHAR(MAX)
SELECT
@COLUMN = ISNULL(@COLUMN + ',', '') + '[' + CAST(CONVERT(DATE, [T].[DT]) AS VARCHAR) + ']'
FROM
[#TMP_DATES] AS [T]
DECLARE @Columns2 VARCHAR(MAX)
SET @Columns2 = SUBSTRING(
(
SELECT DISTINCT
',ISNULL(CONVERT(VARCHAR(20),[' + CAST(CONVERT(DATE, [DT]) AS VARCHAR) + '],120),''N/A'') AS ['
+ CAST(CONVERT(DATE, [DT]) AS VARCHAR) + ']'
FROM
[#TMP_DATES]
GROUP BY
[DT]
FOR XML PATH('')
)
,2
,8000
)
DECLARE @QUERY VARCHAR(MAX)
SET @QUERY = 'SELECT UserID, ' + @Columns2
+ ' FROM
(
SELECT A.UserID , B.DT AS DATE2, A.[Clock], A.[Date] FROM hrms.AttendanceRecord A RIGHT OUTER JOIN #TMP_DATES B ON A.[Date]=B.DT
) X
PIVOT
(
MIN([Clock])
FOR [Date] IN (' + @COLUMN + ')
) P
WHERE ISNULL(UserID,'''')<>''''
'
EXEC ( @QUERY )
DROP TABLE [#TMP_DATES]
END
GO
---Execution Line
EXEC dbo.GET_ATTENDANCEREPORT @STARTDATE = '2018-05-01', @ENDDATE= '2018-05-30'
Проблема заключалась в том, что, поскольку часы столбцов имеют дату и время, все столбцы в сводной области были бы датой и временем, которое вы пытались заменить на «N / A», если бы они были нулевыми. «Н / Д» не является действительным датой-временем, поэтому ошибка.