Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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 Server中查找当月(提供日期)的所有第一周(截至第一个星期日的天数)?_Sql_Sql Server_Tsql - Fatal编程技术网

如何在SQL Server中查找当月(提供日期)的所有第一周(截至第一个星期日的天数)?

如何在SQL Server中查找当月(提供日期)的所有第一周(截至第一个星期日的天数)?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想找到所有的第一个工作日到第一个星期日的日期时,该月的任何日期提供给你 例1 给定日期: 2020-04-29 2020-03-29 Select查询的预期结果: The first week of April 2020 ----------------------------------------------------- 2020-04-01 2020-04-02 2020-04-03 2020-04-04 2020-04-05 The first week of March 20

我想找到所有的第一个工作日到第一个星期日的日期时,该月的任何日期提供给你

例1

给定日期:

2020-04-29
2020-03-29
Select查询的预期结果:

The first week of April 2020
-----------------------------------------------------
2020-04-01
2020-04-02
2020-04-03
2020-04-04
2020-04-05
The first week of March 2020
-----------------------------------------------------
2020-03-01
例2

给定日期:

2020-04-29
2020-03-29
Select查询的预期结果:

The first week of April 2020
-----------------------------------------------------
2020-04-01
2020-04-02
2020-04-03
2020-04-04
2020-04-05
The first week of March 2020
-----------------------------------------------------
2020-03-01

您可以使用递归方法:

with r_cte as (
     select dateadd(day, 1,  eomonth('2020-04-29', -1)) as start_dt, dateadd(day, 5, convert(date, EOMONTH('2020-04-29', -1))) as first_wk
     union all
     select dateadd(day, 1, start_dt), first_wk
     from r_cte 
     where start_dt < first_wk
)
select start_dt as first_week
from r_cte;

您需要创建一个返回表的函数,如下所示:

CREATE OR ALTER FUNCTION F_FIRST_N_WEEKDATES (@A_DATE DATETIME2, @N TINYINT)
RETURNS @T TABLE (D DATE)
AS
BEGIN
DECLARE @D DATE = DATEFROMPARTS(YEAR(@A_DATE), MONTH(@A_DATE), 1);
WHILE @N > 0
BEGIN
   INSERT INTO @T VALUES (@D);
   SELECT @D = DATEADD(day, 1, @D), @N-=1;
END
RETURN;
END;
GO
样本:

SELECT *
FROM   dbo.F_FIRST_N_WEEKDATES('2020-04-29', 5)
给出:

D
----------
2020-04-01
2020-04-02
2020-04-03
2020-04-04
2020-04-05

您可以简单地使用while函数打印日期

用于在单个select语句中获取结果。可以在临时表中插入日期值

DECLARE @counter int = 1;
DECLARE @date date = '2020-04-29'

WHILE @counter <= 7
BEGIN
    select datefromparts(year(@date), month(@date), @counter); 
    SET @counter = @counter + 1;
END

如果您想要月内第一个星期一之前的所有天,则可以使用递归CTE:

with dates as (
     select dateadd(day, 1, eomonth('2020-04-29', -1)) as dte
     union all
     select dateadd(day, 1, dte)
     from dates 
     where datename(weekday, dte) <> 'Sunday'
)
select *, datename(weekday, dte)
from dates;
这假设一周从星期一开始需要7天,尽管很容易调整为不返回行


问题是:第一周可以部分包含在一个月内,还是全部包含在一个月内?我不认为示例中有5个工作日这一事实是一个常数。因为4月5日是星期天,他几乎肯定会在5点停下来。我怎么知道我需要通过5点才能进入e。第一周的天数?如果第一周只有一天呢?e、 g.2020年3月的第一个星期,在这种情况下,我希望2020-03-01作为结果。您如何定义第一个星期?正如您在下面回答的那样,我预计到该月的第一个星期日之前的所有日子都是这样。谢谢