在 SQL Server 2008 中使用 BETWEEN 运算符时,不在查询中包含此特定日期

Not include this specific date in the query when using BETWEEN operator in SQL Server 2008

有一个具体日期我不想包含在其中,即“04/08/2020”。我想过滤从年初到现在的所有记录,但不过滤 04/08/2020。我该怎么做?

SELECT 
     dbo.PID_RespiratorFit.PTIDNum,
     rtrim(acp.LastName) + ', ' + rtrim(acp.FirstName) AS Name,
     acp.BadgeID AS ID,
     dbo.Patient.PcFLD01 as Organization,
     dbo.PID_RespiratorFit.Risk AS Exposure, 
     UPPER(dbo.PID_RespiratorFit.Type) AS Mask_Type,
     dbo.PID_RespiratorFit.OHSNotes AS Comments,
     dbo.PID_RespiratorFit.MedicallyClearedDate AS Medically_Cleared,
     dbo.PID_RespiratorFit.TrainingCompletedDate, 
     dbo.PID_RespiratorFit.DateIssued AS N95_Fittest_Completed, 
     dbo.PID_RespiratorFit.Mask AS N95_respirator,
     dbo.PID_RespiratorFit.PAPR,
     dbo.PID_RespiratorFit.PaprFitTestDate AS PAPR_Fittest_Completed,
     dbo.PID_RespiratorFit.Active,
     DATEADD(year, 1, dbo.PID_RespiratorFit.MedicallyClearedDate) AS Compliant_Through
FROM       dbo.PID_RespiratorFit LEFT JOIN 
           dbo.Patient ON dbo.PID_RespiratorFit.PTIDNum = dbo.Patient.PTIDNUM LEFT JOIN
           dbo.aspnet_CustomProfile acp ON dbo.Patient.PGuid = acp.UserId
WHERE (dbo.PID_RespiratorFit.DateIssued BETWEEN '1-1-2020' AND Getdate())

您可以尝试以下 - 添加额外条件

    SELECT 
     dbo.PID_RespiratorFit.PTIDNum,
     rtrim(acp.LastName) + ', ' + rtrim(acp.FirstName) AS Name,
     acp.BadgeID AS ID,
     dbo.Patient.PcFLD01 as Organization,
     dbo.PID_RespiratorFit.Risk AS Exposure, 
     UPPER(dbo.PID_RespiratorFit.Type) AS Mask_Type,
     dbo.PID_RespiratorFit.OHSNotes AS Comments,
     dbo.PID_RespiratorFit.MedicallyClearedDate AS Medically_Cleared,
     dbo.PID_RespiratorFit.TrainingCompletedDate, 
     dbo.PID_RespiratorFit.DateIssued AS N95_Fittest_Completed, 
     dbo.PID_RespiratorFit.Mask AS N95_respirator,
     dbo.PID_RespiratorFit.PAPR,
     dbo.PID_RespiratorFit.PaprFitTestDate AS PAPR_Fittest_Completed,
     dbo.PID_RespiratorFit.Active,
     DATEADD(year, 1, dbo.PID_RespiratorFit.MedicallyClearedDate) AS Compliant_Through
FROM       dbo.PID_RespiratorFit LEFT JOIN 
           dbo.Patient ON dbo.PID_RespiratorFit.PTIDNum = dbo.Patient.PTIDNUM LEFT JOIN
           dbo.aspnet_CustomProfile acp ON dbo.Patient.PGuid = acp.UserId
WHERE (dbo.PID_RespiratorFit.DateIssued BETWEEN '1-1-2020' AND Getdate())
AND cast(dbo.PID_RespiratorFit.DateIssued as date)<>'2020-04-08'

使用标准日期格式!那么:

WHERE dbo.PID_RespiratorFit.DateIssued BETWEEN '2020-01-01' AND Getdate() and
      dbo.PID_RespiratorFit.DateIssued <> '2020-04-08'  -- or is that 2020-08-04???

如果日期真的是date/time,那么使用:

WHERE dbo.PID_RespiratorFit.DateIssued BETWEEN '2020-01-01' AND Getdate() and
      CONVERT(DATE, dbo.PID_RespiratorFit.DateIssued) <> '2020-04-08'  -- or is that 2020-08-04???

我还强烈推荐 table 别名,这样查询更容易编写和阅读。例如:

SELECT . . .
FROM dbo.PID_RespiratorFit rf LEFT JOIN 
     dbo.Patient p
     ON rf.PTIDNum = p.PTIDNUM LEFT JOIN
     dbo.aspnet_CustomProfile acp
     ON p.PGuid = acp.UserId
    WHERE rf.DateIssued BETWEEN '2020-01-01' AND Getdate() AND
          CONVERT(DATE, rf.DateIssued) <> '2020-04-08'  -- or is that 2020-08-04???