C# 如何根据DATEFIRST查找日期的周数

C# 如何根据DATEFIRST查找日期的周数,c#,sql-server,sql-server-2008,C#,Sql Server,Sql Server 2008,如果开始日是星期二,结束日是星期一,如何查找日期的周数 以下是示例标准 我尝试了以下查询: 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,

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

以下是示例标准

我尝试了以下查询:

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))
如果开始日是星期天,结束日是星期六,则此项工作正常。

将第一天设置为星期二

执行以下查询

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')
更新


设置一周的第一天并再次运行查询。查看此项了解详细信息:@Danish看起来很有用。但在这种情况下,我需要更改查询。您可以建议使用DateFirst进行查询吗?如果开始日期是星期日,则星期号应返回为4,以用于今天。回答基于:。请让我知道它是否有效。月的第一天和接下来的6天是否始终被视为月的第1周?使用输入参数@FROMDATE和getdate+2运行相同的查询,它会给出不正确的2015年1月1日第1周第0号输出。该日期的结果应该是什么@Ankush Madankar2015年1月1日第1周我已经更新了答案。请检查@Ankush MadankarCheck的getdate+8,它给出了2015年1月1日的日期,但这一周是第二天,即2015年1月7日Wend,即2015年1月2日,这在2个月内无效,即@StartDate='2014-12-01'和@EndDate='2015-01-01'getdate+2,给出结果2015年1月第5周你应该给出开始日期作为该月的第一个日期,因为你希望答案是第1周。不管怎样,根据你的说法,答案应该是什么?我不知道确切的答案。我需要在报告中的某个地方显示每周和每月的文件计数。我可以每月做一次,但不能每周做一次。谢谢你的回复。萨拉和你。现在我想我需要找工作了!2014年12月1日的“周号”应该是什么?
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))
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)