我试图在SQL Server 2008中获得最近的星期五。获取最近一个星期五的日期SQL
我有这个。它得到本周开头(星期一),然后减去3天得到星期五。
declare @recentFriday datetime = DATEADD(ww, DATEDIFF(dd,0,GETDATE()), 0)-3
当这一周运行时,它得到上周五的日期是正确的。但是在周五(或周六)运行时,它仍然会获得上周的日期,而不是当周的周五。我即将使用if/else条件,但我确定有一个更简单的方法。
我试图在SQL Server 2008中获得最近的星期五。获取最近一个星期五的日期SQL
我有这个。它得到本周开头(星期一),然后减去3天得到星期五。
declare @recentFriday datetime = DATEADD(ww, DATEDIFF(dd,0,GETDATE()), 0)-3
当这一周运行时,它得到上周五的日期是正确的。但是在周五(或周六)运行时,它仍然会获得上周的日期,而不是当周的周五。我即将使用if/else条件,但我确定有一个更简单的方法。
这适用于任何输入和DATEFIRST
任何设置:
dateadd(d, -((datepart(weekday, getdate()) + 1 + @@DATEFIRST) % 7), getdate())
它通过调整星期值来进行工作,以便0 =星期五,模拟星期五为星期一开始。然后减去周日值,如果非零,以获得最近的星期五。
编辑:已更新为适用于任何设置DATEFIRST
。
使用已知周五日期(我将使用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 */
只需选择一个已知周五,它比你的任何日期年长在你的计算中使用。
您可以检查是否星期的当天是星期五或更大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
这取决于'@@ DATEFIRST'设置。如果我尝试'SET DATEFIRST 2',它会返回'2011-05-06',对于'SET DATEFIRST 1',它会返回'2011-05-13' –
@Martin,我同意你的意见,但OP很容易添加该变量进入SQL提议。 – RRUZ
这里才达到一个完全地组面向方式的最后一个星期五:
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
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
感谢您的解释 – James
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]
可能重复的[查找上星期日](http://stackoverflow.com/questions/1794697/find-last-sunday)。类似乔的回答 – gbn