通过SQL得到某年内每周的开始日期和结束日期

示例效果为:
得到某年内 每周的开始日期结束日期
每周以周日为第一天
一周以至少还有四天为计


2004/01/01 是已经周四
那么2004年的第一周从2004/01/04开始

2007/12/31 是周二
那么2007年的最后一周只到2007/12/19开始
那么2008年的第一周从2007/12/30开始

相关代码如下:
--------------
1.tWeek表 
CREATE TABLE [tWeek] (
    [tSeqID] [int] IDENTITY (1, 1) NOT NULL ,
    [tYear] [int] NULL ,
    [tWeekSeq] [int] NULL ,
    [tStartDate] [datetime] NULL ,
    [tEndDate] [datetime] NULL ,
    CONSTRAINT [PK_tWeek] PRIMARY KEY  CLUSTERED 
    (
        [tSeqID]
    )  ON [PRIMARY] 
) ON [PRIMARY]
GO

 2.生成相关数据的SQL语句

DECLARE @SYear int --开始年份
DECLARE @EYear int --结束年份

SET DATEFIRST 7 --设周日为每周第一天
SET @SYear = 2004
SET @EYear = 2010
--周以至少四天为计 
--判断第一周的开始与结束
DECLARE @YSDate DATETIME --年的第一周开始时间
DECLARE @YEDate DATETIME --年的最后周结束时间
DECLARE @WSDate DATETIME --用于循环的年内某周的开始日期
DECLARE @WEDate DATETIME --用于循环的年内某周的开始日期
DECLARE @IWeek int --当前周为本年的第几周
WHILE @SYear<=@EYear
BEGIN--BEGIN WHILE YEAR

SET @YSDate= CAST( (CAST( @SYear  AS  VARCHAR(4) )+'/01/01') AS DATETIME)
SET @YEDate= CAST( (CAST( @SYear  AS  VARCHAR(4) )+'/12/31') AS DATETIME)
SET @IWeek=1

IF DATEPART(DW,@YSDate)>4--第一周已不足4天 从第二周开始算第一周
  BEGIN    
    SET @YSDate= DATEADD(DAY,(8-DATEPART(DW,@YSDate)) ,@YSDate)--本周开始日期
  END
ELSE--第一周足4天 从本周日算第一天
  BEGIN
    SET @YSDate= DATEADD(Day,(-(DATEPART(DW,@YSDate)-1)) ,@YSDate)
  END

SET @WSDate = @YSDate
SET @WEDate= DATEADD(DAY,6,@WSDate) --本周结束日期

WHILE DATEDIFF(DAY,@WSDate,@YEDate)>=4
   BEGIN
    --执行Insert
    INSERT INTO tWeek(tYear, tWeekSeq, tStartDate, tEndDate)
    VALUES(@SYear,@IWeek,@WSDate,@WEDate)
        --重置参数
        SET @IWeek=@IWeek+1
        SET @WSDate=@WSDate+7
        SET @WEDate=@WEDate+7
   END

SET @SYear=@SYear+1

END--END WHILE YEAR
3.生成的tWeek表内部分数据示例 

顺序号  年份   第几周    该周开始日期           该周结束日期
tSeqID  tYear  tWeekSeq  tStartDate             tEndDate
1 2004 1 2004-01-04 00:00:00.000 2004-01-10 00:00:00.000
2 2004 2 2004-01-11 00:00:00.000 2004-01-17 00:00:00.000
...
208 2007 52 2007-12-23 00:00:00.000 2007-12-29 00:00:00.000
209 2008 1 2007-12-30 00:00:00.000 2008-01-05 00:00:00.000

//得到近五周 
//以当前日期所在周为准 前推四周
SELECT tSeqID, tYear, tWeekSeq, tStartDate, tEndDate 
FROM tWeek 
WHERE tSeqID BETWEEN 
(SELECT tSeqID-4 FROM tWeek 
WHERE GETDATE() BETWEEN tStartDate AND tEndDate) 
AND 
(SELECT tSeqID FROM tWeek 
WHERE GETDATE() BETWEEN tStartDate AND tEndDate)
 
-- 得到 2007年8月的周 
-- 2007是 年 参数 可由ddl_Year得 
-- 8是 月 参数 可由ddl_Month得 
-- 2007.08.01 是拼成的临时参数 
-- 以至少本月内还有四于的周才算数 
SELECT * FROM dbo.tWeek 
WHERE tYear=2007 
AND DATEDIFF(MONTH,DATEADD(DAY,3,tStartDate),'2007.08.01') = 0 
OR DATEDIFF(MONTH,DATEADD(DAY,-4,tEndDate),'2007.08.01') = 0
 
 
--取得每月最后一周 
--判断条件 
-- 因为至少月四天在本月 才算在本月 
--1.本周 结束日期 加 4 在下月 
--2.本周 结束日期 减 3 在本月 
SELECT tYear, tWeekSeq ,tStartDate , tEndDate 
FROM tWeek 
WHERE DATENAME(MONTH,DATEADD(DAY,4,tEndDate)) <> DATENAME(MONTH,tStartDate) 
AND DATENAME(MONTH,DATEADD(DAY,-3,tEndDate)) = DATENAME(MONTH,tStartDate) 

--判断某周是否是当月最后一周 
SELECT CASE COUNT(tSeqID) 
WHEN 0 THEN '否' ELSE '是' END AS COLB 
FROM tWeek 
WHERE tSeqID=3 
AND DATENAME(MONTH,DATEADD(DAY,4,tEndDate)) <> DATENAME(MONTH,tStartDate) 
AND DATENAME(MONTH,DATEADD(DAY,-3,tEndDate)) = DATENAME(MONTH,tStartDate)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值