如何在SQL中更新周数?

时间:2015-03-05 05:59:43

标签: sql sql-server tsql week-number

我有一个按日期排序的跟随者。我想将每个星期系列分组如下。

Select  tq.ID,
        CONVERT(VARCHAR(10),tq.DateCreated,101)WeekDate,
        DATENAME(WEEKDAY,tq.DateCreated)WeekDays,
        CASE When DATEPART(WEEKDAY,tq.DateCreated)-1=0 THEN 7 ELSE  DATEPART(WEEKDAY,tq.DateCreated)-1 END as WeekSerial
    From #temp tq

当前数据:

ID  WeekDate                WeekDays    WeekSerial  WeekNumber
56  2012-03-01 00:00:00.000 Thursday    4            NULL
57  2012-03-02 00:00:00.000 Friday      5            NULL
58  2012-03-03 00:00:00.000 Saturday    6            NULL
59  2012-03-04 00:00:00.000 Sunday      7            NULL
62  2012-03-05 00:00:00.000 Monday      1            NULL
63  2012-03-06 00:00:00.000 Tuesday     2            NULL
64  2012-03-07 00:00:00.000 Wednesday   3            NULL
65  2012-03-08 00:00:00.000 Thursday    4            NULL
67  2012-03-09 00:00:00.000 Friday      5            NULL
68  2012-03-10 00:00:00.000 Saturday    6            NULL
69  2012-03-11 00:00:00.000 Sunday      7            NULL
70  2012-03-12 00:00:00.000 Monday      1            NULL
71  2012-03-13 00:00:00.000 Tuesday     2            NULL
73  2012-03-14 00:00:00.000 Wednesday   3            NULL
74  2012-03-15 00:00:00.000 Thursday    4            NULL
76  2012-03-16 00:00:00.000 Friday      5            NULL
77  2012-03-17 00:00:00.000 Saturday    6            NULL
78  2012-03-18 00:00:00.000 Sunday      7            NULL

必填数据

ID  WeekDate                WeekDays    WeekSerial  WeekNumber
56  2012-03-01 00:00:00.000 Thursday    4            1
57  2012-03-02 00:00:00.000 Friday      5            1
58  2012-03-03 00:00:00.000 Saturday    6            1
59  2012-03-04 00:00:00.000 Sunday      7            1
62  2012-03-05 00:00:00.000 Monday      1            2
63  2012-03-06 00:00:00.000 Tuesday     2            2
64  2012-03-07 00:00:00.000 Wednesday   3            2
65  2012-03-08 00:00:00.000 Thursday    4            2
67  2012-03-09 00:00:00.000 Friday      5            2
68  2012-03-10 00:00:00.000 Saturday    6            2
69  2012-03-11 00:00:00.000 Sunday      7            2
70  2012-03-12 00:00:00.000 Monday      1            3
71  2012-03-13 00:00:00.000 Tuesday     2            3
73  2012-03-14 00:00:00.000 Wednesday   3            3
74  2012-03-15 00:00:00.000 Thursday    4            3
76  2012-03-16 00:00:00.000 Friday      5            3
77  2012-03-17 00:00:00.000 Saturday    6            3
78  2012-03-18 00:00:00.000 Sunday      7            3

所以,我想将这些值分组,以周数为单位,对于WeekSerial数字范围从1到7必须从1开始。

注意: 工作日从星期一到星期日开始,因此编号从1到7.即1 =星期一,2 =星期二等等......!

更新

INSERT INTO #Temp(KioskCount,KioskAmount,KioskAverage,WeekDate,WeekDays,WeekSerial)     
Select  COUNT(tq.quoteid)KioskCount,
        SUM(tq.PriceQuote) [KioskAmount],
        SUM(tq.PriceQuote) / COUNT(tq.QuoteID) [KioskAverage],
        CONVERT(VARCHAR(10),tq.DateCreated,101)WeekDate,
        DATENAME(WEEKDAY,tq.DateCreated)WeekDays,
        CASE When DATEPART(WEEKDAY,tq.DateCreated)-1=0 THEN 7 ELSE  DATEPART(WEEKDAY,tq.DateCreated)-1 END as WeekSerial
from tbl_Quotes tq
where 
tq.QuoteStatusID <> 12 --remove void transactions
group by CONVERT(VARCHAR(10),tq.DateCreated,101),DATENAME(WEEKDAY,tq.DateCreated),DATEPART(WEEKDAY,tq.DateCreated)-1 
order by 4

2 个答案:

答案 0 :(得分:0)

实际上还不清楚你的期望是什么

您已经提交了一个WeekDate,我认为日期是正确的,并且基于您在工作日字段中填写

然后只需循环查看日期并使用WeekDate

更新周数

我可以提供一个例子

DECLARE @DATE DATETIME
DECLARE @count int
DECLARE @i int
SET @i=56// you can find your first id via query too
SET @count=(select COUNT(WeekDays) from tablename)
WHILE  @i<=@count
BEGIN

SET @DATE =(select  WeekDate from tablename where ID=@i)
update tablename set WeekNumber=(
SELECT DATEPART(WEEK, @DATE)  -
DATEPART(WEEK, DATEADD(MM, DATEDIFF(MM,0,@DATE), 0))+ 1 AS WEEK_OF_MONTH)
where ID=@i
set @i=@i + 1
END;

它将使用相应的数字

更新所有的周数字段

答案 1 :(得分:0)

这可能会对你有所帮助:

  1. 首先,您需要检查数据库中的第一天

    SELECT @@DATEFIRST
    

    默认情况下,SUNDAY是一周的第一天(美国)。所以你需要将它改为1(星期一)

    SET DATEFIRST 1
    

    关于SET DATEFIRST

  2. 的更多信息
  3. 在SQL Server中使用DATEPART内置函数,您可以获得一年中的周数

    SELECT DATAPART(WEEK, WeekDate)
    

    您还可以获得所选日期时间的年份

    SELECT DATAPART(YEAR, WeekDate)
    

    如果您为第一行运行这两个查询(假设为第1周)

    SELECT DATEPART(WEEK, '2012-03-01 00:00:00.000') -- Output = 10
    SELECT DATEPART(YEAR, '2012-03-01 00:00:00.000') -- Output = 2012
    

    但本周应该是你的第1周。

    • 因此,您可以轻松地从YEAR中减去2012年,然后乘以52(因为我们一年有52周)

    • 从WEEKNUMBER

    • 中减去9
    • 添加您从上面获得的数字

      (YEAR - 2012) * 52 + (WEEK - 9)
      
  4. 通过运行此功能,您可以获得实际结果

    SELECT (DATEPART(YEAR, WeekDate) - 2012) * 52 + DATEPART(WEEK, WeekDate) - 9 AS WeekNumber
    FROM yourTable