如何获得这个月的周数从SQL Server 2008中的日期(How to get week num

2019-06-18 17:09发布

在Microsoft SQL Server的SQL语句,还有一个内置的函数来获取星期数,但它是一年中的一周。

Select DatePart(week, '2012/11/30') // **returns 48**

返回值48是一年中的周数。

而不是48,我想1,2,3或4(每月的周数)。 我觉得这个月的周数可以通过模块,这个星期的月份数来实现。 对于如

Select DATEPART(week, '2012/11/30')%MONTH('2012/11/30')

但我想知道是否有其他内置功能来获得一个月的WeekNumber在MS SQL SERVER。

Answer 1:

这里有两种不同的方式,两者都假定每周从星期一开始

如果你想周保持完整,所以他们属于一个月中,他们开始:所以周六2012-09-01,周日2012-08-30为4周,周一2012-09-03本周是1使用这样的:

declare @date datetime = '2012-09-01'
select datepart(day, datediff(day, 0, @date)/7 * 7)/7 + 1

如果削减monthchange您的周周六这么和2012-09-01 2012-08-30星期日是1周,周一2012-09-03本周是2使用这样的:

declare @date datetime = '2012-09-01'
select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1


Answer 2:

DECLARE @DATE DATETIME
SET @DATE = '2013-08-04'

SELECT DATEPART(WEEK, @DATE)  -
    DATEPART(WEEK, DATEADD(MM, DATEDIFF(MM,0,@DATE), 0))+ 1 AS WEEK_OF_MONTH


Answer 3:

没有内置功能。 这取决于你用一个月的一周是什么意思。 你可能意味着无论是在第7天(1周),第二7天(2周),等等。在这种情况下,它也只是

(DATEPART(day,@Date)-1)/7 + 1

如果你想使用同一个星期编号为与DATEPART(周)时,您可以使用第一个月,问题中的日期(+1)的周数之间的差异:

(DATEPART(week,@Date)- DATEPART(week,DATEADD(m, DATEDIFF(m, 0, @Date), 0))) + 1

或者,您可能需要别的东西,这取决于你所说的周数是什么。



Answer 4:

只要看看日期,看看它的范围下降英寸

范围1-7是第一周,范围8-14是第二个星期,等

SELECT 
CASE WHEN DATEPART(day,yourdate) < 8 THEN '1' 
  ELSE CASE WHEN DATEPART(day,yourdate) < 15 then '2' 
    ELSE CASE WHEN  DATEPART(day,yourdate) < 22 then '3' 
      ELSE CASE WHEN  DATEPART(day,yourdate) < 29 then '4'     
        ELSE '5'
      END
    END
  END
END


Answer 5:

类似于第二溶液,更少的代码:

declare @date datetime = '2014-03-31'
SELECT DATEDIFF(week,0,@date) - (DATEDIFF(week,0,DATEADD(dd, -DAY(@date)+1, @date))-1)


Answer 6:

没有内置功能,让您的周数。 我不认为将有助于你反正是周在一个月数目不恒定。

http://msdn.microsoft.com/en-us/library/bb675168.aspx

我想你可以用4把数(48),并采取相同和项目的模块,作为该月的周数,通过添加一个到的结果。



Answer 7:

下面是获得一周的第一天和最后一天了一个月的建议:

-- Build a temp table with all the dates of the month 
drop table #tmp_datesforMonth 
go

declare @begDate datetime
declare @endDate datetime

set @begDate = '6/1/13'
set @endDate = '6/30/13';

WITH N(n) AS  
(   SELECT 0  
        UNION ALL 
    SELECT n+1 
    FROM N 
    WHERE n <= datepart(dd,@enddate)
)
SELECT      DATEADD(dd,n,@BegDate) as dDate 
into #tmp_datesforMonth
FROM        N
WHERE       MONTH(DATEADD(dd,n,@BegDate)) = MONTH(@BegDate)

--- pull results showing the weeks' dates and the week # for the month (not the week # for the current month) 

select  MIN(dDate) as BegOfWeek
, MAX(dDate) as EndOfWeek 
, datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, dDate), 0)), 0), dDate) as WeekNumForMonth 
from #tmp_datesforMonth
group by datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, dDate), 0)), 0), dDate) 
order by 3, 1


Answer 8:

检查了这一点...它的工作的罚款。

declare @date as datetime = '2014-03-10'
select DATEPART(week,@date) - DATEPART(week,cast(cast(year(@date) as varchar(4))+'-' + cast(month(@date) as varchar(2)) + '-01' as datetime))+1


Answer 9:

使用DENSE_RANK函数脏,但容易一行。 性能将受到影响,但有效的没有少。

DENSE_RANK()over(Partition by Month(yourdate),Year(yourdate) Order by Datepart(week,yourdate) asc) as Week


Answer 10:

这是导致上无论周数查询startdayendday一周的可能。

SET DATEFIRST 2    

DECLARE @FROMDATE DATE='12-JAN-2015'
-- Get the first day of month
DECLARE @ALLDATE DATE=DATEADD(month, DATEDIFF(month, 0, @FROMDATE), 0)
DECLARE @FIRSTDATE DATE


;WITH  CTE as
(
     -- Get all dates in that month
     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)
)
-- Retrieves the first day of week, ie, if first day of week is Tuesday, it selects first Tuesday 
SELECT TOP 1 @FIRSTDATE =   DATES 
FROM    CTE 
WHERE DATEPART(W,DATES)=1

SELECT (DATEDIFF(DAY,@FIRSTDATE,@FROMDATE)/7)+1 WEEKNO

欲了解更多信息,我已经回答了以下问题。 可以检查。

  • 如何根据DATEFIRST找到一个日期的周数


Answer 11:

floor((day(@DateValue)-1)/7)+1


Answer 12:

干得好....

IM使用下面的代码..

DATEPART(WK,@DATE_INSERT) - DATEPART(WK,DATEADD(DAY,1,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DATE_INSERT),0)))) + 1


Answer 13:

尝试下面的代码:

declare @dt datetime='2018-03-15 05:16:00.000'
IF (Select (DatePart(DAY,@dt)%7))>0
  Select  (DatePart(DAY,@dt)/7) +1
ELSE
  Select  (DatePart(DAY,@dt)/7)


Answer 14:

你可以简单地通过获取一个月的最低周数得到周数和周数中扣除。 假设你有一个日期的表

select
    emp_id, dt , datepart(wk,dt) - (select min(datepart(wk,dt))
from
    workdates ) + 1 from workdates


Answer 15:

解:

declare @dt datetime='2018-03-31 05:16:00.000'
IF (Select (DatePart(DAY,@dt)%7))>0
Select  (DatePart(DAY,@dt)/7) +1
ELSE
Select  (DatePart(DAY,@dt)/7)


Answer 16:

declare @end_date datetime = '2019-02-28';
select datepart(week, @end_date) - datepart(week, convert(datetime, substring(convert(nvarchar, convert(datetime, @end_date), 127), 1, 8) + '01')) + 1 [Week of Month];


Answer 17:

这里是经得起考验的解决方案,这个查询在任何情况下 - 就像如果每月的1日是周五,那么这也将工作 -

select (DATEPART(wk,@date_given)-DATEPART(wk,dateadd(d,1-day(@date_given),@date_given)))+1

以上是一些解决方案,这将失败,如果这个月的第一次约会是在周五,则4将是本月的第二周



Answer 18:

代码如下:

set datefirst 7
declare @dt datetime='29/04/2016 00:00:00'
select (day(@dt)+datepart(WEEKDAY,dateadd(d,-day(@dt),@dt+1)))/7


文章来源: How to get week number of the month from the date in sql server 2008