如何检查商店程序中的密码到期列是否只剩下14,7,3,2,1天了?

时间:2017-06-15 07:52:39

标签: sql-server

  

我有一个sp,我检查用户的密码更改日期是否有14天   左(flag=0)我发送电子邮件给那些用户和我检查(通过   col.flag)如果电子邮件已经发送或者没有。之后我更新了   标记col.in另一个SP(ExpiryNotificationFlag)到1个用户列表,其电子邮件具有   已发送..现在我不知道如何检查7,3,2,1天作为标志   col值已经是1?

        SELECT  TenantName
              , TenantEmail 
              , GMAP_code
              , ContactID       FROM (
                SELECT    b_1.TenantName
                        , b_1.TenantEmail
                        , LastPDWChangeDate =(SELECT ISNULL(max (DateChanged),GETDATE()) FROM dbo.wsm_Contact_PwdHistory WHERE ContactID = b_1.TenantRegContactID)
                        , ExpiryNotificationFlag =(SELECT top 1 ExpiryNotificationFlag FROM dbo.wsm_Contact_PwdHistory WHERE ContactID = b_1.TenantRegContactID order by DateChanged desc)
                        , GMAP_code =(SELECT TOP 1 ISNULL(GMAP_CODE,'') from wsm_Ref_Buildings where BuildingId = b_1.BuildingID)
                        , b_1.TenantRegContactID as ContactID
                FROM     dbo.wsm_Contact AS a LEFT OUTER JOIN  
                (
                    SELECT C.Name AS TenantName
                        , A.SiteID
                        , A.BuildingID
                        , A.FloorID
                        , A.ContactID AS TenantRegContactID
                        , D.LEASID
                        , C.Phone AS TenantPhone
                        , C.Email AS TenantEmail
                        , B.UserID AS userid
                        , C.Mobile AS TenantMobile 
                        , B.UserType 
                    FROM  dbo.wsm_Contact_Tenancy AS A 
                    INNER JOIN  dbo.wsm_Contact_User AS B ON A.ContactID = B.ContactID AND B.Active = 1  
                    INNER JOIN  dbo.wsm_Contact AS C ON B.ContactID = C.ContactID 
                    INNER JOIN  (
                            SELECT DISTINCT COALESCE (LEASID, ExtLeasNum) AS LEASID
                                , SiteID
                                , BuildingID
                                , FloorID  
                            FROM  dbo.wsm_Contact) AS D ON A.SiteID = D.SiteID AND A.BuildingID = D.BuildingID AND A.FloorID = D.FloorID) AS b_1 ON   
                                COALESCE (a.LEASID, a.ExtLeasNum) = b_1.LEASID AND a.SiteID = b_1.SiteID AND a.BuildingID = b_1.BuildingID AND a.FloorID = b_1.FloorID 
                            INNER JOIN  dbo.wsm_Ref_Floors AS C ON a.FloorID = C.FloorId  
                            WHERE (a.OCCPSTAT NOT IN ('I', 'P')) and C.Deleted = 0 and b_1.userid is not null       ) AS A WHERE   DATEDIFF(DAY,A.LastPDWChangeDate,getdate()) = 76 AND ISNULL(ExpiryNotificationFlag,0) <> 1

END

更新查询

 UPDATE dbo.wsm_Contact_PwdHistory  set ExpiryNotificationFlag = 1 WHERE ContactID = @ContactID 

2 个答案:

答案 0 :(得分:0)

您基本上提出以下投诉:

  

“布尔数据类型只能存储两个值中的一个!”

确实,所以将该标志换成“剩余天数”列,并将其与14,7比较,无论如何....

注意,ExpiryNotificationFlag列不是一个好名字 - “PasswordExpiryEmailSent”怎么样

有时,当列具有更好的名称时,这些问题会更容易思考

答案 1 :(得分:0)

你可以这样做

( (DATEDIFF(DAY,A.LastPDWChangeDate,getdate()) = 76 AND ISNULL(ExpiryNotificationFlag,0) = 0)  --14 days      

  or (DATEDIFF(DAY,A.LastPDWChangeDate,getdate()) = 83 AND ISNULL(ExpiryNotificationFlag,0) = 1) --7days      

  or (DATEDIFF(DAY,A.LastPDWChangeDate,getdate()) = 87 AND ISNULL(ExpiryNotificationFlag,0) = 2) --3 days      

  or (DATEDIFF(DAY,A.LastPDWChangeDate,getdate()) = 88 AND ISNULL(ExpiryNotificationFlag,0) = 3) --2 days      
  or (DATEDIFF(DAY,A.LastPDWChangeDate,getdate()) = 89 AND ISNULL(ExpiryNotificationFlag,0) = 4) --1 day      

  )  

因为你必须将Expiry通知标志修改为int而不是布尔值 在那之后创建一个SP,你将在哪里更新值 0到1,1到2,2到3等