40

在 microsoft sql server 的 SQL Statement 中,有一个内置函数可以获取周数,但它是一年中的第几周。

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

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

而不是48,我想得到1、2、3 或 4(一个月的周数)。我认为本月的周数可以通过具有本周月数的模块来实现。例如

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

但我想知道是否有其他内置函数可以在 MS SQL SERVER 中获取当月的 WeekNumber。

4

24 回答 24

63

这里有 2 种不同的方式,都假设一周从星期一开始

如果您希望周是完整的,那么它们属于它们开始的月份:因此,星期六 2012-09-01 和星期日 2012-09-02 是第 4 周,星期一 2012-09-03 是第 1 周,请使用:

DECLARE @date date = '2012-09-01'
SELECT (day(datediff(d,0,@date)/7*7)-1)/7+1

如果您的周数因月份变化而减少,因此星期六 2012-09-01 和星期日 2012-09-02 是第 1 周,星期一 2012-09-03 是第 2 周,请使用以下命令:

DECLARE @date date = '2012-09-01'
SELECT 
  datediff(ww,datediff(d,0,dateadd(m,datediff(m,7,@date),0)
    )/7*7,dateadd(d,-1,@date))+1

我收到了杰拉德的电子邮件。他指出了第二种方法的缺陷。现在应该修复

我收到了本威尔金斯的一封电子邮件。他指出了第一种方法的缺陷。现在应该修复

于 2012-10-29T10:35:40.773 回答
13
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
于 2013-08-06T05:20:35.723 回答
9

没有内置功能。这取决于您所说的每月一周的含义。您可能的意思是它是否在前 7 天(第 1 周),后 7 天(第 2 周)等。在这种情况下,它只是

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

如果您想使用与 DATEPART(week,) 相同的周编号,您可以使用当月第一天的周数与相关日期 (+1) 之间的差异:

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

或者,您可能需要其他东西,具体取决于您所说的周数。

于 2012-10-29T06:56:58.880 回答
7

只要看看日期,看看它在什么范围内。

范围 1-7 是第 1 周,范围 8-14 是第 2 周,依此类推。

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
于 2013-12-30T03:42:45.323 回答
3

与第二种解决方案类似,代码更少:

declare @date datetime = '2014-03-31'
SELECT DATEDIFF(week,0,@date) - (DATEDIFF(week,0,DATEADD(dd, -DAY(@date)+1, @date))-1)
于 2014-11-10T12:26:03.137 回答
2

看看这个......它工作正常。

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
于 2014-03-10T07:34:07.607 回答
2
WeekMonth = CASE WHEN (DATEPART(day,TestDate) - datepart(dw,TestDate))>= 22 THEN '5' 
                 WHEN (DATEPART(day,TestDate) - datepart(dw,TestDate))>= 15 THEN '4' 
                 WHEN (DATEPART(day,TestDate) - datepart(dw,TestDate))>= 8 THEN '3'
                 WHEN (DATEPART(day,TestDate) - datepart(dw,TestDate))>= 1 THEN '2' 
                 ELSE '1'
             END 
于 2019-08-01T11:37:25.577 回答
1

没有内置函数可以获取周数。无论如何,我认为除以对您没有帮助,因为一个月中的周数不是恒定的。

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

我想您可以将数字(48)除以 4,然后将相同的模块作为该月的周数,然后在结果中加一。

于 2012-10-29T05:36:32.600 回答
1

以下是获取一个月一周的第一天和最后一天的建议:

-- 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
于 2013-07-09T21:40:48.553 回答
1

使用 Dense_Rank 函数的肮脏但简单的单列。性能会受到影响,但仍然有效。

DENSE_RANK()over(Partition by Month(yourdate),Year(yourdate) Order by Datepart(week,yourdate) asc) as Week
于 2014-08-22T19:49:18.787 回答
1
floor((day(@DateValue)-1)/7)+1
于 2014-11-26T01:14:16.787 回答
1

干得好....

我使用下面的代码..

DATEPART(WK,@DATE_INSERT) - DATEPART(WK,DATEADD(DAY,1,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DATE_INSERT),0)))) + 1
于 2014-12-01T12:49:51.450 回答
1

这是一个查询,它可以将周数带入可能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

有关更多信息,我已经回答了以下问题。可以检查一下。

于 2015-01-02T11:08:28.077 回答
1

试试下面的代码:

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)
于 2018-03-15T10:47:24.540 回答
1

有一个内置选项可以获取一年中的周数

**select datepart(week,getdate())**
于 2019-09-09T06:10:41.707 回答
0

您可以通过获取月份的最小周数并从周数中扣除来简单地获得周数。假设您有一张带日期的表格

select
    emp_id, dt , datepart(wk,dt) - (select min(datepart(wk,dt))
from
    workdates ) + 1 from workdates
于 2015-12-21T11:41:14.943 回答
0

解决方案:

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)
于 2018-03-15T11:36:42.797 回答
0
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];
于 2019-02-02T12:32:15.157 回答
0

这是在任何情况下针对此查询的久经考验的解决方案 - 例如,如果本月 1 日是星期五,那么这也将起作用 -

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

以上是一些解决方案,如果该月的第一个日期是星期五,则将失败,那么第四个将是该月的第二周

于 2019-05-08T10:12:30.910 回答
0

这里的逻辑在每个月也可以工作 4.3 周。从除一月之外的每个月的 DATEPART(WEEK) 中获取。只是另一种看待事物的方式。这也将占第 5 周的月份

DECLARE @date VARCHAR(10)
SET @date = '7/27/2019'

SELECT CEILING(DATEPART(WEEK,@date)-((DATEPART(MONTH,@date)-1)*4.3333)) 'Week of Month'
于 2019-07-22T18:04:25.743 回答
0

仅当您在选择列表中显示每月的每周时,以下才会起作用。否则 rank 函数将不起作用,但它是一个很好的解决方案。

SELECT DENSE_RANK() OVER (PARTITION BY MONTH(DATEFIELD) 
                          ORDER BY DATEPART(WEEK,DATEFIELD) ASC) AS WeekofMont
于 2021-06-18T07:11:56.003 回答
0

试试这个

declare @date datetime = '20210928'

select convert(int,(((cast(datepart(day,@date) as decimal(4,2))/7)-(1.00/7.00))+1.00))
于 2021-10-08T00:59:49.240 回答
-1

代码如下:

set datefirst 7
declare @dt datetime='29/04/2016 00:00:00'
select (day(@dt)+datepart(WEEKDAY,dateadd(d,-day(@dt),@dt+1)))/7
于 2016-02-05T11:47:25.210 回答
-1
select @DateCreated, DATEDIFF(WEEK, @DateCreated, GETDATE())
于 2019-11-12T06:49:59.410 回答