【问题标题】:How do I find week number of a date according to DATEFIRST如何根据 DATEFIRST 找到日期的周数
【发布时间】:2015-01-01 23:50:52
【问题描述】:

如果开始日是星期二,结束日是星期一,如何找到 date 的周数?

这是示例条件

      Date                          Output  
     ......                       ..........            
 01-Dec-2014 (Monday)   - 2014_DECEMBER_WEEK_NO_1 
 04-Dec-2014 (Thursday) - 2014_DECEMBER_WEEK_NO_1 
 29-Dec-2014 (Monday)   - 2014_DECEMBER_WEEK_NO_4 
 30-Dec-2014 (Tuesday)  - 2014_DECEMBER_WEEK_NO_5 
 31-Dec-2014 (Tuesday)  - 2014_DECEMBER_WEEK_NO_5

我尝试了以下查询:

select CAST(UPPER(DATENAME(YEAR, @FROMDATE)) AS VARCHAR(20))
+'_'+CAST(UPPER(DATENAME(MONTH, @FROMDATE)) AS VARCHAR(20))
+'_WEEK_NO_'+CAST((DAY(@FROMDATE) 
+ (DATEPART(DW, DATEADD (MONTH, DATEDIFF (MONTH, 0, @FROMDATE), 0))-1) -1)/7 + 1 AS VARCHAR(10))

如果开始日是星期日,结束日是星期六,则此工作正常。

【问题讨论】:

  • 设置一周的第一天并再次运行查询。详情请查看:msdn.microsoft.com/en-za/library/ms181598.aspx
  • @Danish 看起来很有用。但在这种情况下我需要更改查询。你能用DATEFIRST建议查询吗
  • 如果开始日期是星期日,那么今天的 week_no 应该返回 4
  • 添加了一个基于:stackoverflow.com/questions/8642870/… 的答案。请让我知道它是否有效。
  • 是该月的第一天,接下来的 6 天始终被视为该月的第 1 周?

标签: c# sql-server sql-server-2008


【解决方案1】:

将您的第一天设置为Tuesday

SET DATEFIRST 2

执行以下查询

DECLARE @FROMDATE DATE='31-Dec-2014'

SELECT CAST(UPPER(DATENAME(YEAR, @FROMDATE)) AS VARCHAR(20))
+'_'+CAST(UPPER(DATENAME(MONTH, @FROMDATE)) AS VARCHAR(20))
+'_WEEK_NO_'+REPLACE(CAST((DAY(@FROMDATE) 
+ (DATEPART(DW, DATEADD (MONTH, DATEDIFF (MONTH, 0, @FROMDATE), 0))-1) -1)/7  AS VARCHAR(10)),'0','1')

更新

SET DATEFIRST 2

DECLARE @FROMDATE DATE='12-JAN-2015'
DECLARE @ALLDATE DATE=DATEADD(month, DATEDIFF(month, 0, @FROMDATE), 0)
DECLARE @FIRSTDATE DATE


; WITH  CTE as
 (
     SELECT 1 RNO,CAST(@ALLDATE AS DATE) as DATES 
     UNION ALL
     SELECT RNO+1, DATEADD(DAY,1,DATES )
     FROM    CTE
     WHERE   DATES < DATEADD(MONTH,1,@ALLDATE)
 )
 SELECT TOP 1 @FIRSTDATE =   DATES 
 FROM    CTE 
 WHERE DATEPART(W,DATES)=1


SELECT CAST(UPPER(DATENAME(YEAR, @FROMDATE)) AS VARCHAR(20))
+'_'+CAST(UPPER(DATENAME(MONTH, @FROMDATE)) AS VARCHAR(20))
+'_WEEK_NO_'+CAST((DATEDIFF(DAY,@FIRSTDATE,@FROMDATE)/7)+1  AS VARCHAR(10))

【讨论】:

  • 使用输入参数@FROMDATEgetdate()+2 运行相同的查询,它给出的输出2015_JANUARY_WEEK_NO_0 不正确。
  • 该日期的结果应该是什么? @Ankush Madankar
  • 2015_JANUARY_WEEK_NO_1
  • 我已经更新了答案。请检查@Ankush Madankar
  • 检查getdate() + 8 它给出了2015_JANUARY_WEEK_NO_1 但那一天是第二周(2015-01-07 Wend),即2015_JANUARY_WEEK_NO_2
【解决方案2】:
set datefirst 2 

DECLARE  @StartDate DATE = '2014-12-01',
         @EndDate   DATE = '2014-12-31',
         @DayCount int 


SELECT @DayCount = count(* )
FROM   (SELECT TOP ( datediff(DAY,@StartDate,@EndDate) + 1 )
                        [Date] = dateadd(DAY,ROW_NUMBER()
                  OVER(ORDER BY c1.name),
                  DATEADD(DD,-1,@StartDate))
        FROM   [master].[dbo].[spt_values] c1 ) x
WHERE  datepart(dw,[Date]) = 1;


select CAST(UPPER(DATENAME(YEAR, @EndDate)) AS VARCHAR(20))
+'_'+CAST(UPPER(DATENAME(MONTH, @EndDate)) AS VARCHAR(20))
+'_WEEK_NO_'+ Cast(@DayCount as varchar)

【讨论】:

  • 这不会工作 2 个月,即 @StartDate = '2014-12-01' and @EndDate = '2015-01-01' (getdate() + 2),给出结果 2015_JANUARY_WEEK_NO_5
  • 您应该将开始日期指定为当月的第一个日期,因为您希望答案为 week_no_1。无论如何,根据你的答案应该是什么?
  • 我不知道确切的答案。我需要在报告中的某个地方显示每周和每月的文档计数。我可以每月做,但不能每周做。感谢您的答复。 sarath 和你。现在我想我需要找到解决方法!
  • 2014 年 12 月 1 日的“WEEK_NO”应该是什么?
猜你喜欢
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多