我正试图在SQL Server 2008中获得最新的星期五。
我有这个。它会在一周的开始(星期一)然后减去3天才能到达星期五。
declare @recentFriday datetime = DATEADD(ww, DATEDIFF(dd,0,GETDATE()), 0)-3
如果在一周内运行,它会在上周五的日期正确。但是当在周五(或周六)运行时,它仍然会在上周的日期而不是当前周的周五。我即将使用if / else条件,但我确信这是一种更简单的方法。
答案 0 :(得分:14)
这适用于DATEFIRST
的任何输入和任何设置:
dateadd(d, -((datepart(weekday, getdate()) + 1 + @@DATEFIRST) % 7), getdate())
它的工作原理是调整工作日值,使0 =星期五,模拟星期五作为星期的开始。然后减去工作日值(如果非零)以获得最近的星期五。
修改:已更新,可用于DATEFIRST
。
答案 1 :(得分:6)
DECLARE @date DATETIME = '20110512' -- Thursday
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110506
SET @date = '20110513' -- Friday
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110513
SET @date = '20110514' -- Saturday
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110513
答案 2 :(得分:4)
您可以检查当前星期几是星期五还是更大DATEPART(dw,GETDATE())
,然后致电(SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)+4)
或(SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)-3)
SELECT
CASE WHEN DATEPART(dw,GETDATE()) >= 5 THEN
(SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)+4)
ELSE
(SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)-3)
END
答案 3 :(得分:3)
使用已知的星期五日期(我将使用2011年1月7日)作为起点,您可以这样做:
DECLARE @d DATETIME
SET @d = '2011-05-13' /* Friday */
SELECT DATEADD(DAY, (DATEDIFF (DAY, '20110107', @d) / 7) * 7, '20110107')
/* Returns 2011-05-13 */
SET @d = '2011-05-12' /* Thursday */
SELECT DATEADD(DAY, (DATEDIFF (DAY, '20110107', @d) / 7) * 7, '20110107')
/* Returns 2011-05-06 */
只需选择一个已知的星期五,它比您在计算中使用的任何日期都要早。
答案 4 :(得分:1)
SELECT CONVERT(VARCHAR(12),GETDATE()) AS Today,
CASE WHEN (DATEPART(DW,GETDATE())< 7)
THEN CONVERT(VARCHAR(12),(DATEADD(dd,-(DATEPART(DW,GETDATE())+1),GETDATE())))
ELSE CONVERT(VARCHAR(12),(DATEADD(d,- 1,GETDATE())))
END AS [Last Friday]
答案 5 :(得分:1)
其他解决方案不适用于我的用例。
这可用于查找前一天,方法是将“星期日”替换为您要查找的日期:
DECLARE @myDate DATE = GETDATE()
WHILE DATENAME(WEEKDAY, @myDate) <> 'Sunday'
BEGIN
SET @myDate = DATEADD(DAY, -1, @myDate)
END
答案 6 :(得分:0)
这是一个完全面向集合的方式来实现上周五:
select Friday from
(
select max(GetDate()) as Friday where datepart(dw, getdate()) = 6
union all
select max((GetDate() - 1)) where datepart(dw, (getdate() - 1)) = 6
union all
select max((GetDate() - 2)) where datepart(dw, (getdate() - 2)) = 6
union all
select max((GetDate() - 3)) where datepart(dw, (getdate() - 3)) = 6
union all
select max((GetDate() - 4)) where datepart(dw, (getdate() - 4)) = 6
union all
select max((GetDate() - 5)) where datepart(dw, (getdate() - 5)) = 6
) x where Friday is not null
答案 7 :(得分:0)
这就是我希望得到的帮助
DECLARE @UserDate DateTime
SET @UserDate = '2020-09-03'
SELECT DATEADD(day, (6 - datepart(weekday, @UserDate)) , @UserDate)