【问题标题】:How to Update Week Number in SQL?如何在 SQL 中更新周数?
【发布时间】:2015-03-05 05:59:42
【问题描述】:

我有一个按日期显示的以下内容。我想按如下方式对每个周系列进行分组。

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

所以,我想将这些值分组到必须从 1 开始的 weeknumber 下,因为 WeekSerial 编号范围从 1 到 7。

注意: 工作日从星期一到星期日开始,因此编号从 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

【问题讨论】:

  • 问题不清楚,您想在INSERT 声明中实现什么?

标签: sql sql-server tsql week-number


【解决方案1】:

目前还不清楚你的期望是什么

您已经提交了一个 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;

它会用相应的数字更新你所有的 weeknumber 字段

【讨论】:

    【解决方案2】:

    这可能对你有帮助:

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

      SELECT @@DATEFIRST
      

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

      SET DATEFIRST 1
      

      更多关于SET DATEFIRST的信息

    2. 在 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)
        
    3. 所以通过运行这个你可以得到实际的结果

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

    【讨论】:

      猜你喜欢
      • 2022-11-03
      • 1970-01-01
      • 2014-07-21
      • 2019-10-05
      • 2014-12-06
      • 2012-10-23
      • 2022-01-17
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多