Sql 取消上周五的约会
我有这个查询,以提取给定日期的最后一个星期五日期。它可以全天工作,除非给定的日期是今天 选择dateadd(d),(datepart(工作日,getdate())+1+@@DATEFIRST)% 7) ,getdate()) 例如,今天是2014年2月14日。如果我应用于上述查询,返回的结果仍然是2014-02-14 dateadd(d),((datepart(工作日,'2014-02-14')+1+@@DATEFIRST)%7), ‘2014-02-14’) 如果我把2014-02-13放在下面,那么它正确地返回了上周五的日期 选择dateadd(d),((datepart(工作日,'2014-02-13')+1+ @@日期1)%7),“2014-02-13”Sql 取消上周五的约会,sql,sql-server,Sql,Sql Server,我有这个查询,以提取给定日期的最后一个星期五日期。它可以全天工作,除非给定的日期是今天 选择dateadd(d),(datepart(工作日,getdate())+1+@@DATEFIRST)% 7) ,getdate()) 例如,今天是2014年2月14日。如果我应用于上述查询,返回的结果仍然是2014-02-14 dateadd(d),((datepart(工作日,'2014-02-14')+1+@@DATEFIRST)%7), ‘2014-02-14’) 如果我把2014-02-13放在下
如果今天是星期五,你能帮助我如何得到上星期五的日期吗。暴力方法如何:
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()
引用替换为另一个日期的另一个日期。您可以用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移到模函数的外面。这对我很有用:
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;
但是,我始终建议您在本地设置下确保查询的安全。我猜是这样吗?如果语言设置不是英语怎么办?此外,使用已被弃用。这在任何新代码中都应该避免。谢谢你的文章。像许多评论一样,我一直在做vs=。这将是一个很难改掉的习惯。没问题,我认为
alias=column
而不是column as alias
完全是个人偏好,我不会强迫任何人使用其中一种,但这是我能找到的最清楚的文章,证实了column as“alias”
被弃用。它在页面的某个地方,所以我不知道为什么我会链接它。
SET DATEFIRST 6;
SELECT DATEADD(DAY, -DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE))