Bimith Kunhiraman Ответов: 2

При выполнении процедуры появляется ошибка


CREATE PROCEDURE Login_Logout_Rpt
AS 
BEGIN
    DECLARE @SDOW DATETIME
    SET @SDOW= (SELECT DATEADD(DAY, 2 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)))
    PRINT @SDOW
    SET NOCOUNT ON

    ;WITH CteUserInOut(RowNUm,DtDate,Access_ID,Access_Name,Access_Profile,Access_Type,Access_Country,Access_SourceIP,Access_SourceHost,mnmUser,DtTime,InOut) AS
    (
        SELECT ROW_NUMBER() OVER (ORDER BY UserInOut.mnmUser,UserInOut.DtTime) AS RowNUm
              ,CAST(UserInOut.DtTime AS DATE)AS DtDate
              ,DealerAddMrv.mnmUser as Access_ID
              ,DealerAddMrv.mnmUserName as Access_Name
              ,DealerAddMrv.mnmRole as Access_Profile
              ,UserInOut.mnmUserAccessType as Access_Type
              ,'IND' AS Access_Country
              ,CASE WHEN CHARINDEX(',',UserInOut.mnmIPDetails,1) > 0 
                    THEN SUBSTRING(UserInOut.mnmIPDetails,1,CHARINDEX(',',UserInOut.mnmIPDetails,1)-1)
                    ELSE
 UserInOut.mnmIPDetails 
                    END As Access_SourceIP, 'NULL' as Access_SourceHost
              ,UserInOut.InOut
              ,UserInOut.mnmUser
              ,UserInOut.DtTime
        FROM       dbo.UserInOut 
        INNER JOIN dbo.DealerAddMrv ON DealerAddMrv.mnmUser = UserInOut.mnmUser 
        WHERE UserInOut.DtTime >= @SDOW
    )
    SELECT  U1.Access_ID
            ,U1.Access_Name
            ,U1.Access_Profile
            ,U1.Access_Type
            ,U1.Access_Country
            ,U1.Access_SourceIP
            ,U1.Access_SourceHost
            ,U1.DtTime AS Access_LoginTimeStamp
            ,U2.DtTime AS Access_LogOutTimeStamp
    FROM (SELECT * FROM CteUserInOut WHERE InOut = 'IN') AS U1
    JOIN (SELECT * FROM CteUserInOut WHERE InOut = 'OUT' ) AS U2 
         ON  U2.RowNUm  = U1.RowNUm+1 
         AND U1.mnmUser = U2.mnmUser 
         AND U1.DtDate  = U2.DtDate

END

GO


exec Login_Logout_Rpt


Что я уже пробовал:

я создал процедуру, как показано ниже

CREATE PROCEDURE Login_Logout_Rpt
AS 
BEGIN
    DECLARE @SDOW DATETIME
    SET @SDOW= (SELECT DATEADD(DAY, 2 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)))
    PRINT @SDOW
    SET NOCOUNT ON

    ;WITH CteUserInOut(RowNUm,DtDate,Access_ID,Access_Name,Access_Profile,Access_Type,Access_Country,Access_SourceIP,Access_SourceHost,mnmUser,DtTime,InOut) AS
    (
        SELECT ROW_NUMBER() OVER (ORDER BY UserInOut.mnmUser,UserInOut.DtTime) AS RowNUm
              ,CAST(UserInOut.DtTime AS DATE)AS DtDate
              ,DealerAddMrv.mnmUser as Access_ID
              ,DealerAddMrv.mnmUserName as Access_Name
              ,DealerAddMrv.mnmRole as Access_Profile
              ,UserInOut.mnmUserAccessType as Access_Type
              ,'IND' AS Access_Country
              ,CASE WHEN CHARINDEX(',',UserInOut.mnmIPDetails,1) > 0 
                    THEN SUBSTRING(UserInOut.mnmIPDetails,1,CHARINDEX(',',UserInOut.mnmIPDetails,1)-1)
                    ELSE
 UserInOut.mnmIPDetails 
                    END As Access_SourceIP, 'NULL' as Access_SourceHost
              ,UserInOut.InOut
              ,UserInOut.mnmUser
              ,UserInOut.DtTime
        FROM       dbo.UserInOut 
        INNER JOIN dbo.DealerAddMrv ON DealerAddMrv.mnmUser = UserInOut.mnmUser 
        WHERE UserInOut.DtTime >= @SDOW
    )
    SELECT  U1.Access_ID
            ,U1.Access_Name
            ,U1.Access_Profile
            ,U1.Access_Type
            ,U1.Access_Country
            ,U1.Access_SourceIP
            ,U1.Access_SourceHost
            ,U1.DtTime AS Access_LoginTimeStamp
            ,U2.DtTime AS Access_LogOutTimeStamp
    FROM (SELECT * FROM CteUserInOut WHERE InOut = 'IN') AS U1
    JOIN (SELECT * FROM CteUserInOut WHERE InOut = 'OUT' ) AS U2 
         ON  U2.RowNUm  = U1.RowNUm+1 
         AND U1.mnmUser = U2.mnmUser 
         AND U1.DtDate  = U2.DtDate

END


при выполнении этой процедуры появляется ошибка, как показано ниже

Msg 241, Уровень 16, состояние 1, процедура Login_Logout_Rpt, строка 9 преобразование не удалось при преобразовании даты и/или времени из символьной строки.

Richard MacCutchan

Какую часть сообщения об ошибке вы не понимаете?

Bimith Kunhiraman

я понял часть ошибки но не могу разобраться в ней не могли бы вы мне помочь

2 Ответов

Рейтинг:
0

OriginalGriff

Прочтите сообщение об ошибке: это довольно ясно:

Цитата:
Преобразование не удалось при преобразовании даты и/или времени из символьной строки.

Это означает то, что он говорит: он не может преобразовать символьную строку в действительную дату.
Что, вероятно, означает, что по крайней мере одна из ваших строк содержит UserInOut.DtTime запись, которая не является допустимой или находится в формате, который SQL не ожидает.

И это означает, что вы плохо спроектировали свою БД: никогда не храните данные на основе даты или времени в строковых столбцах (VARCHAR, NVARCHAR), всегда преобразуйте их в подлинное и действительное значение DateTime в коде вашего приложения, прежде чем пассивировать его в качестве параметра SQL и хранить в столбце qa DATE или DATETIME.
Потому что если вы этого не сделаете, дни, недели, месяцы, даже годы спустя вы попытаетесь использовать его в качестве даты, и он потерпит неудачу - так же, как и для вас, - и к тому времени будет уже слишком поздно, чтобы понять, что пользователь хотел ввести.

Измените свою базу данных, исправьте неверные записи, измените свое приложение, чтобы оно больше не могло добавлять.
Мы ничего не можем сделать для вас.


Рейтинг:
0

#realJSOP

Я подозреваю, что у вас есть неправильно сформированная дата в UserInOut.DtTime колонка. Это либо ноль, либо не дата.

Попробуйте изменить актерский состав так, чтобы он читался следующим образом:

CASE WHEN ISDATE(UserInOut.DtTime) = 1 
     THEN CAST(UserInOut.DtTime AS DATE) 
     ELSE CAST(GETDATE() AS DATE) 
     END AS DtDate


Никаких гарантий, но попробовать стоит.