Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 取消上周五的约会_Sql_Sql Server - Fatal编程技术网

Sql 取消上周五的约会

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放在下

我有这个查询,以提取给定日期的最后一个星期五日期。它可以全天工作,除非给定的日期是今天

选择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”


如果今天是星期五,你能帮助我如何得到上星期五的日期吗。

暴力方法如何:

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))