给定日期范围内特定日期/天的列表

时间:2015-10-08 08:20:58

标签: sql-server

我正在查找给定日期范围内特定日期/天的列表,我发现了这个

declare @d datetime
select @d = '20100101'  --'20090101'  if you want 2009 etc etc

select dateadd(dd,number,@d) from master..spt_values
where type = 'p'
and year(dateadd(dd,number,@d))=year(@d)
and DATEPART(dw,dateadd(dd,number,@d)) = 7

在   get date of all saturdays in a given year - sql server

我想知道我是否可以使用开始日期和结束日期而不是年份,并且可以获得像星期六和星期日这样的两天清单。

问候

3 个答案:

答案 0 :(得分:0)

这将为您提供@start和@end之间每天的天数:

declare @start date = '20151001', @end date = '20151017'
Select c = DATEDIFF(DAY, @start, @end)/ 7
     + case when (7 + DATEPART(WEEKDAY, @start) + (DATEDIFF(DAY, @start, @end)% 7) - d) % 7 <= (DATEDIFF(DAY, @start, @end)%7) then 1 else 0 end
From (values(1), (2), (3), (4), (5), (6), (7)) as days(d)

输出:

Day 1   2
Day 2   2
Day 3   2
Day 4   2
Day 5   3
Day 6   3
Day 7   3

它完全避免在@start和@end之间的每一天使用递归CTE和DATEADD。这只是一些数学。

对于多个日期,您也可以使用类似的东西,尽管它在大范围内效率不高:

declare @start date = '20151001', @end date = '20151017'

Select DATEADD(DAY, n, @start), DATEPART(WEEKDAY, DATEADD(DAY, n, @start))
From (
    Select top(DATEDIFF(DAY, @start, @end)+1) ROW_NUMBER() over(order by n)-1
    From (
        Select 1 From (values(1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) as v1(n)
        Cross Join (values(1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) as v2(n)
        Cross Join (values(1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) as v3(n)
    ) as v(n)
) as o(n)
Where DATEPART(WEEKDAY, DATEADD(DAY, n, @start)) in (7, 1)

输出:

DATE        WEEKDAY
2015-10-03  7
2015-10-04  1
2015-10-10  7
2015-10-11  1
2015-10-17  7

这里,7 =星期六,1 =星期天。您可以添加1到7之间的任何值,也可以来自另一个表。 如果您使用DATENAME,它可以被日期名称替换。

然后您只需要添加一个组和/或一个总和来获得星期六和星期日的数量。

V1 / V2 / V3避免使用递归查询并快速生成从0到X(最多999)的数字列表。 X是@start和@end之间的差异。如果您需要10.000天的范围(等等......),请添加v4,但是超过2年就足够了1000,差不多是3。

答案 1 :(得分:0)

递归选择所有日期from_dateTo_Date,然后使用DATEPART检查是否为周末。

declare @from_date as date---your from date
declare @to_date as date---your to date

;WITH dates AS (
    SELECT CONVERT( DATE, @from_date) AS a
    UNION ALL
    SELECT DATEADD( DAY, 1, a )
    FROM   dates
    WHERE  DATEADD( DAY, 1, a ) <= @to_date --including the @to_date
)
SELECT a
FROM   dates
WHERE  DATEPART( dw, a ) IN ( 1, 7 ) --- Saturday Or Sunday

如果您想查看“仅周日”

SELECT a
    FROM   dates
    WHERE  DATEPART( dw, a )=1

如果您想查看“仅周六”

SELECT a
    FROM   dates
    WHERE  DATEPART( dw, a )=7

答案 2 :(得分:-1)

rajeshmpanchal scrpit的一个小修改。

  1. 添加cte maxrecursion - 默认为100行。
  2. 设置datefirst 1 / *星期一*
  3. 你可以试试这个:

    $con = mysqli_connect("localhost","username","password","database");
    
    $tname = "Big Bang";
    $cname = "Mike";
    $cemail = "test@gmail.com";
    $cphone = "123-456-7898";
    
    $teamToken = strtoupper(bin2hex(mcrypt_create_iv(6, MCRYPT_DEV_URANDOM)));
    
    $query = "INSERT INTO teams (token, tname, captain, email, phone) VALUES ('" . $teamToken . "', '" . $tname . "', '" . $cname . "', '" . $cemail . "', '" . $cphone . "')";
    
    if (mysqli_query($con, $query))
    {
        echo "Pass!";
    }
    else
    {
        echo $query;
    }
    
    mysqli_close($con);