0

我们将用户的最后 3 次登录时间存储在我们的数据库中。之后,我们使用以下过程获取用户的最后登录详细信息。不幸的是,我们在用户登录仪表板上获得了当前的登录日期和时间。请帮助我们更正以下程序:

ALTER PROCEDURE [dbo].[gspVEBUserLastLoginDetails_GetLastLogin]
    (@userLastLoginUserId bigint = null)
AS
   select Top 1 NewDate  
   from 
     (SELECT
         TOP 2 (CONVERT(varchar(26), UserLastLogin_Date,107)+' '+RIGHT(CONVERT(VarChar, UserLastLogin_Date, 100), 7)) as NewDate
      FROM
         [dbo].[VEB_UserLastLoginDetails]
      WHERE  
         (@userLastLoginUserId IS NULL OR [UserLastLogin_UserId] = @userLastLoginUserId)
      ORDER BY
          NewDate DESC) AS  t1
4

1 回答 1

1

尝试:

ALTER PROCEDURE [dbo].[gspVEBUserLastLoginDetails_GetLastLogin]
(
    @userLastLoginUserId bigint = null
)
AS
BEGIN
    IF COALESCE(@userLastLoginUserId,0)<>0
    BEGIN
        SELECT MAX(VEB_UserLastLoginDetails.UserLastLogin_Date)
        FROM VEB_UserLastLoginDetails
        WHERE VEB_UserLastLoginDetails.UserLastLogin_UserID = @userLastLoginUserID;
    END
    ELSE
    BEGIN
        SELECT MAX(VEB_UserLastLoginDetails.UserLastLogin_Date)
        FROM VEB_UserLastLoginDetails;
    END
END
GO

我在这里做一些假设。我使用的表是:

CREATE TABLE VEB_UserLastLoginDetails
(
    UserLastLogin_Date datetime
    , UserLastLogin_UserID INT
);

我使用以下方法插入了几行:

INSERT INTO VEB_UserLastLoginDetails VALUES (GETDATE(), 1);
    GO 3;

然后我使用以下方法执行存储过程:

EXEC gspVEBUserLastLoginDetails_GetLastLogin 1;

它自然地返回最近登录的最大日期。

如果您在不传递 UserID 的情况下执行存储过程,如下所示:

EXEC gspVEBUserLastLoginDetails_GetLastLogin;

它返回最近的登录,无论哪个用户实际登录。

于 2013-09-18T16:24:12.990 回答