在SQL Server上使用TSQL ...
我需要生成仅使用日期编号的数据库中使用“发薪日”列的摘录,例如,如果该发薪日是在周末,则使用26来产生月份中第26天的摘录,然后该提取物的数据应在周末之前的星期五提取。
有人尝试过这种方法并且能够提供一些通过TSQL实现此方法的方法吗?
谢谢
答案 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公式。)