如何查询最近2个工作日

时间:2017-04-18 16:25:13

标签: sql-server-2008

我正在运行一个查询来提取我正在寻找的正确信息,但我需要它来过去2个工作日而不是过去2天。这在星期一开始发挥作用,我的结果显示星期一和星期日而不是星期一和星期五的信息。如何才能将我的查询更改为仅在工作日拉出来?

USE [LetterGeneration]

SELECT  g.LetterGenerationPrintJobId
      ,CAST(t.[TemplateKey] AS VarChar) AS LetterCode
      ,convert(char(12),r.CreatedDate,101) AS CreatedDate
      ,s.LetterGenerationStatusId AS Status
      ,s.StatusKey AS StatusDesc
      ,count(g.LetterGenerationId) as LetterCount
      ,c.BankingDateYorN

  FROM [LetterGenerationTemplateRequest] AS r

  INNER JOIN [LetterGenerationTemplate] AS t
  ON t.[LetterGenerationTemplateId] = r.LetterGenerationTemplateId
  INNER JOIN LetterGeneration g
  ON g.LetterGenerationTemplateRequestId = r.LetterGenerationTemplateRequestId
  INNER JOIN LetterGenerationStatus s 
  ON g.LetterGenerationStatusId = s.LetterGenerationStatusId
  INNER JOIN Enterprise..Calendar C
  ON c.BeginDate = g.LetterDate

WHERE ((DATEDIFF(d, r.CreatedDate, GETDATE()) = 0) OR (DATEDIFF(d, r.CreatedDate, GETDATE()) = 1))
--BankingDateYorN = 1
--AND RelativeTimeValue_BusinessDates =-1
AND t.[TemplateKey] NOT LIKE '%PLTV1%' 
AND s.LetterGenerationStatusId NOT LIKE '4'
AND s.LetterGenerationStatusId NOT LIKE '16'
AND s.LetterGenerationStatusId NOT LIKE '19'
AND s.LetterGenerationStatusId NOT LIKE '20'
AND s.LetterGenerationStatusId NOT LIKE '38'


GROUP BY r.[LetterGenerationTemplateRequestId]
      ,r.LetterGenerationTemplateId
      ,g.Lettergenerationprintjobid
      ,t.[TemplateKey]
      ,r.[Loan_no]
      ,r.CreatedDate
      ,r.[CreatedBy]
      ,s.LetterGenerationStatusId
      ,s.StatusKey
      ,c.BankingDateYorN


  ORDER BY r.CreatedDate DESC

更新:我最近发现了如何将日历表加入我当前的查询。日历查询有一个名为BusinessDayYorN的列,其中1个用于工作日,0个用于周末和假日。我还更新了旧查询,现在包括加入。

2 个答案:

答案 0 :(得分:1)

select * 
from LetterGenerationTemplateRequest
where createddate >= (
  getdate() -
  case datename(dw,getdate())
  when 'Tuesday' then 5
  when 'Monday' then 4
  else 3
  end 
)  
--and datename(dw,createdDate) not in ('Saturday','Sunday',datename(dw,getdate()))
and datename(dw,createdDate) not in ('Saturday','Sunday')


;  

答案 1 :(得分:0)

假设您总是希望包含最后两个非周末日,您可以尝试:

; with aux as (
    select diff = case 
        when datename(weekday, getdate()) in ('Tuesday', 'Wednesday ', 'Thursday', 'Friday') then 1 
        else 
            case datename(weekday, getdate()) 
                when 'Saturday' then 2
                when 'Sunday' then 3
                when 'Monday' then 4
            end
    end
)

SELECT --r.[LetterGenerationTemplateRequestId]
      --,r.LetterGenerationTemplateId
      g.LetterGenerationPrintJobId
      ,CAST(t.[TemplateKey] AS VarChar) AS LetterCode
      ,r.[Loan_no]
      ,convert(char(12),r.CreatedDate,101) AS CreatedDate
     -- ,g.ModifiedDate
     -- ,convert(varchar(18), g.ModifiedDate - r.CreatedDate, 108) AS TimeSpan
      ,s.LetterGenerationStatusId AS Status
      ,s.StatusKey AS StatusDesc
      ,count(g.LetterGenerationId) as LetterCount

  FROM [LetterGenerationTemplateRequest] AS r

  INNER JOIN [LetterGenerationTemplate] AS t
  ON t.[LetterGenerationTemplateId] = r.LetterGenerationTemplateId
  INNER JOIN LetterGeneration g
  ON g.LetterGenerationTemplateRequestId = r.LetterGenerationTemplateRequestId
  INNER JOIN LetterGenerationStatus s 
  ON g.LetterGenerationStatusId = s.LetterGenerationStatusId
WHERE 
    DATEDIFF(day, r.CreatedDate, GETDATE()) <= (select diff from aux)
    AND t.[TemplateKey] NOT LIKE '%PLTV1%' 
    AND s.LetterGenerationStatusId NOT LIKE '4'
    AND s.LetterGenerationStatusId NOT LIKE '16'
    AND s.LetterGenerationStatusId NOT LIKE '19'
    AND s.LetterGenerationStatusId NOT LIKE '20'
    AND s.LetterGenerationStatusId NOT LIKE '38'  
GROUP BY r.[LetterGenerationTemplateRequestId]
      ,r.LetterGenerationTemplateId
      ,g.Lettergenerationprintjobid
      ,t.[TemplateKey]
      ,r.[Loan_no]
      ,r.CreatedDate
     -- ,g.ModifiedDate
      ,r.[CreatedBy]
      ,s.LetterGenerationStatusId
      ,s.StatusKey
  ORDER BY r.CreatedDate DESC

CTE aux返回的数据集只包含一条记录且只有一个字段,其值是您需要在WHERE语句中返回的天数。