40

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

しかし、MS SQL SERVER でその月の WeekNumber を取得するための組み込み関数が他にあることを知りたいです。

4

24 に答える 24

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 に答える
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

月の最初と最後の曜日を取得するための提案を次に示します。

-- 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

週番号を取得する組み込み関数はありません。とにかく、月の週数は一定ではないため、分割が役立つとは思いません。

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

数値 (48) を 4 で割り、同じモジュールを取り、結果に 1 を追加することで、その月の週番号としてそれを投影できると思います。

于 2012-10-29T05:36:32.600 に答える
1
floor((day(@DateValue)-1)/7)+1
于 2014-11-26T01:14:16.787 に答える
0

ここでのロジックは、毎月 4.3 週間も機能します。1 月を除く毎月の 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

解決:

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 に答える