到目前为止,我已完成以下操作:
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
答案 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'