两个约会之间的周末

时间:2015-03-24 19:09:11

标签: sql sql-server date datetime

到目前为止,我已完成以下操作:

declare @date int=7
declare @curDate date=getdate()

create table #temp(dat date,day1 varchar(max))

while @date>0
begin
insert into #temp values(@curDate,DATENAME(DW,@curDate))
set @curDate=DATEADD(Day,-1,@curDate)
if(DATENAME(DW,@curDate)<>'Saturday' and DATENAME(DW,@curDate)<>'Sunday')
  begin
 set @date=@date-1
  end

  End

  select * from #temp

通过此代码,我可以轻松找到两个日期之间是否有周末。

我的问题是:

  

有没有其他方法可以找到两个日期之间是否有周末或   不

e.g

  

date1 '03 -25-2015'和date2 '03 -30-2015'周末与否?

示例/预期输出:

table1
(
id bigint, 
value1 varchar(50),
value2 decimal(18,2),
.
.
.
date1 date
)
  

让passdate1(firstdate(min))和passdate2(last date(max))是两个   给定日期:

我想这样:

select * from table1 where date1 between case 
when (passdate1,passdate2) has weekend and it's no is 2 days
then passdate1 and dateadd(day,2,passdate2) 
else
passdate1 and passdate2 end

4 个答案:

答案 0 :(得分:1)

使用递归公用表表达式选择所有日期,然后使用DATEPART确定每个日期是否为周末

;WITH dates AS (
    SELECT CONVERT( DATE, '2015-01-01' ) AS a
    UNION ALL
    SELECT DATEADD( DAY, 1, a )
    FROM   dates
    WHERE  DATEADD( DAY, 1, a ) < '2015-02-01'
)
SELECT a
FROM   dates
WHERE  DATEPART( dw, a ) IN ( 1, 7 )

答案 1 :(得分:0)

定义&#34;在&#34;之间。它必须是一个完整的两天周末吗?端点是否有周末时间?端点日期是否相同?

我不太确定您是如何使用上述代码的。您可能会检查(select count(*) from #temp) < datediff(dd, @date1, @date2),但我没有得到您的想法。

这对你有用吗?当@ date1和@ date2总是工作日时,它会检测到一个完整的周末。

datediff(dd, @date1, @date) > 5 or datepart(dw, @date2) < datepart(dw, @date1)

我假设周六和周日的周末,周日开始的日期编号。

答案 2 :(得分:0)

尝试这个解决方案,它实质上计算两个日期之间的差异,如果这些日期等于它,则返回0:

SELECT  *, 
    DATEDIFF(WEEK, StartDate, EndDate) AS NumOfWeekends
FROM (VALUES 
    ('2015-03-03', '2015-03-25'),
    ('2015-03-03', '2015-03-03'),
    ('2015-03-03', '2015-03-07'),
    ('2015-03-03', '2015-03-08'),
    ('2015-03-07', '2015-03-08'),
    ('2015-03-07', '2015-03-07'),
    ('2015-03-08', '2015-03-08'),
    ('2015-03-03', NULL)
) x(StartDate, EndDate);

/*
Output:
StartDate  EndDate    NumOfWeekends
---------- ---------- -------------
2015-03-03 2015-03-25 3
2015-03-03 2015-03-03 0
2015-03-03 2015-03-07 0
2015-03-03 2015-03-08 1
2015-03-07 2015-03-08 1
2015-03-07 2015-03-07 0
2015-03-08 2015-03-08 0
2015-03-03 NULL       NULL
*/

注意:DATEDIFF(WEEK并非依赖于this@@DATEFIRST设置。

答案 3 :(得分:0)

试试这个:

DECLARE @sd DATE = '20150326', @ed DATE = '20150329'

IF DATEDIFF(dd, @sd, @ed) >= 7 OR ( DATEPART(dw, @sd) = 7 AND DATEPART(dw, @ed) = 1 )
       OR ( DATEDIFF(dd, @sd, @ed) >= 2 AND DATEPART(dw, @sd) > DATEPART(dw, @ed) )
    PRINT 'YES'
ELSE
    PRINT 'NO'