我有这个查询在给定日期的情况下拉出最后一个星期五日期。除非给定的日期是今天,否则它可以全天使用。
以p为例,今天是2014-02-14。如果我申请上述查询,返回的结果仍然是2014-02-14选择dateadd(d, - ((datepart(weekday,getdate())+ 1 + @@ DATEFIRST)% 7),getdate())
dateadd(d, - ((datepart(工作日,'2014-02-14')+ 1 + @@ DATEFIRST)%7), '2014年2月14日')
如果我把2014-02-13放在下面,那么它会在上个星期五正确返回。
选择dateadd(d, - ((datepart(工作日,'2014-02-13')+ 1 + @@ DATEFIRST)%7),'2014-02-13')
如果今天是星期五,我可以帮助我如何获得上周五的日期。
答案 0 :(得分:6)
您可以查看当天是星期五是DATENAME
,如果是,只需减去7天,否则,请使用您制作的功能
SELECT CASE WHEN DATENAME(WEEKDAY, GETDATE()) = 'Friday' THEN
CONVERT(DATE, DATEADD(DAY, -7, GETDATE()))
ELSE
DATEADD(d, -((DATEPART(WEEKDAY, GETDATE()) + 1 + @@DATEFIRST) % 7), GETDATE())
END AS 'LastFriday'
答案 1 :(得分:3)
蛮力方法怎么样:
select dateadd(day,
(case when datename(weekday, getdate()) = 'Friday' then -7
when datename(weekday, getdate()) = 'Saturday' then -1
when datename(weekday, getdate()) = 'Sunday' then -2
when datename(weekday, getdate()) = 'Monday' then -3
when datename(weekday, getdate()) = 'Tuesday' then -4
when datename(weekday, getdate()) = 'Wednesday' then -5
when datename(weekday, getdate()) = 'Thursday' then -6
end),
cast(getdate() as date)
);
这就是今天的逻辑。您可以将所有getdate()
引用替换为另一个日期的其他日期。
答案 2 :(得分:2)
你的第一次尝试似乎非常接近,我认为你只需要将1移到模数函数之外。这对我有用:
SELECT DATEADD(DAY, -1 - ((DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST) % 7), CAST(GETDATE() AS DATE));
然后在更大的样本上测试它似乎仍然有效:
DECLARE @T TABLE (DateFirst INT, Date DATE, LastFriday DATE)
DECLARE @I INT = 1;
WHILE @I < 8
BEGIN
SET DATEFIRST @i;
WITH TestDates AS
( SELECT Date = DATEADD(DAY, -Number, CAST(GETDATE() AS DATE))
FROM master..spt_values
WHERE Type = 'P'
AND Number BETWEEN 0 AND 20
)
INSERT @T (DateFirst, Date, lastFriday)
SELECT @I,
Date,
LastFriday = DATEADD(DAY, -1 - ((DATEPART(WEEKDAY, Date) + @@DATEFIRST) % 7), Date)
FROM TestDates;
SET @i += 1;
END
SELECT *
FROM @T
PIVOT
( MAX(LastFriday)
FOR DateFirst IN ([1], [2], [3], [4], [5], [6], [7])
) pvt
ORDER BY Date;
这适用于所有语言和日期设置。
如果您可以控制日期优先设置,则会变得更简单:
SET DATEFIRST 6;
SELECT DATEADD(DAY, -DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE))
但是我总是建议您的查询对本地设置安全。