使用周末之前的星期五的天字段生成数据摘录

时间:2018-07-26 15:50:21

标签: sql-server tsql reporting-services formula

在SQL Server上使用TSQL ...

我需要生成仅使用日期编号的数据库中使用“发薪日”列的摘录,例如,如果该发薪日是在周末,则使用26来产生月份中第26天的摘录,然后该提取物的数据应在周末之前的星期五提取。

有人尝试过这种方法并且能够提供一些通过TSQL实现此方法的方法吗?

谢谢

2 个答案:

答案 0 :(得分:0)

我假设您也有可用的月份和年份,在这种情况下,您可以构造一个实际日期,并从周日开始将其作为从1开始的数字来获取星期几。因此,6等于星期五。今天将产生5,因为星期四= 5

SELECT DATEPART(dw, DATEFROMPARTS(2018, 07, 26)) AS [DayOfWeek]

编辑: 我将再次假设,这次是有可能的,就像它总是在当月运行一样。这有点狡猾,因为如果运行得太早或太晚,它们都会崩溃,但至少是可以实现的。

SELECT  DATEPART(dw, DATEFROMPARTS(
    DATEPART(YEAR, GETDATE()), 
    DATEPART(MONTH, GETDATE()), 
    26)) AS [DayOfWeekThisMonth]

编辑2 : 好的,了解到我们正在本月上工作,我们可以这样做:

DECLARE @PayDayNumber INT = 29; -- Replace this with a SELECT to get your value
SELECT CASE(DATEPART(dw, DATEFROMPARTS(DATEPART(YEAR, GETDATE()), DATEPART(MONTH, GETDATE()), @PayDayNumber)))
            WHEN 1 THEN @PayDayNumber - 2 
            WHEN 7 THEN @PayDayNumber - 1
            ELSE @PayDayNumber
            END AS [WeekendSafePayDay]

对于本月(2018年8月),29号将返回29号。您可以将DATEPART(MONTH, GETDATE())更改为9,以测试9月,因为9月29日是星期六,所以将返回28;或者将其更改为7,以测试7月,因为7月29日是星期天,将返回27。

答案 1 :(得分:0)

您在上面的今天评论中说,您假设当月。

首先将您的发薪日数转换为正确的日期:

select dateadd(month,((year(getdate())-1900)*12)+month(getdate())-1,payday-1)
  as paydate

,然后对它使用case语句:

case datename(weekday,paydate)
  when 'Saturday' then dateadd(day,-1,paydate)
  when 'Sunday' then dateadd(day,-2,paydate)
  else paydate
  end as paydateadjust

(显然,这些将需要重写为正确的SQL语句。从Michael Valentine Jones的超级有用的SQL Server日期函数中借用的date公式。)