在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。
答案 0 :(得分:45)
这里有两种不同的方式,两种方式都假设星期一开始一周
如果你想要整周,那么他们属于他们开始的月份: 所以星期六2012-09-01和星期日2012-09-02是第4周和星期一2012-09-03是第1周使用这个:
declare @date datetime = '2012-09-01'
select datepart(day, datediff(day, 0, @date)/7 * 7)/7 + 1
如果您的周变为月变化,那么2012-09-01星期六和星期日2012-09-02是第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
答案 1 :(得分:10)
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
答案 2 :(得分:4)
没有内置功能。这取决于你每周的意思。你可能意味着它是在前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
或者,您可能需要其他内容,具体取决于您在周数中的含义。
答案 3 :(得分:4)
只需查看日期,看看它的范围。
范围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
答案 4 :(得分:2)
与第二种解决方案类似,代码更少:
declare @date datetime = '2014-03-31'
SELECT DATEDIFF(week,0,@date) - (DATEDIFF(week,0,DATEADD(dd, -DAY(@date)+1, @date))-1)
答案 5 :(得分:1)
这是一个查询,它将周数提供给本周的startday
和endday
。
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
有关更多信息,我已回答以下问题。可以检查一下。
答案 6 :(得分:1)
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
答案 7 :(得分: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)
答案 8 :(得分:1)
没有内置功能可以获取周数。我不认为分裂会帮助你,因为一个月内的星期数不是一成不变的。
http://msdn.microsoft.com/en-us/library/bb675168.aspx
我猜你可以将数字(48)除以4并取相同的模块并将其作为当月的周数投影,方法是在结果中加一。
答案 9 :(得分:1)
你走了......
我正在使用下面的代码..
DATEPART(WK,@DATE_INSERT) - DATEPART(WK,DATEADD(DAY,1,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DATE_INSERT),0)))) + 1
答案 10 :(得分:1)
floor((day(@DateValue)-1)/7)+1
答案 11 :(得分:1)
使用Dense_Rank功能的脏而简单的衬垫。性能将受到影响,但同样有效。
DENSE_RANK()over(Partition by Month(yourdate),Year(yourdate) Order by Datepart(week,yourdate) asc) as Week
答案 12 :(得分:1)
检查一下......工作正常。
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
答案 13 :(得分: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
答案 14 :(得分:0)
您可以通过获取最低周数来获取周数,并从周数中扣除。假设你有一个日期表
select
emp_id, dt , datepart(wk,dt) - (select min(datepart(wk,dt))
from
workdates ) + 1 from workdates
答案 15 :(得分: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)
答案 16 :(得分: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];
答案 17 :(得分:0)
这是在任何情况下均可用于此查询的久经考验的解决方案-例如,如果每月的1号在星期五,那么这也将有效-
select (DATEPART(wk,@date_given)-DATEPART(wk,dateadd(d,1-day(@date_given),@date_given)))+1
以上是某些解决方案,如果该月的第一个日期是星期五,则该解决方案将失败,那么第4个将是该月的第二个星期
答案 18 :(得分: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'
答案 19 :(得分:0)
有一个内置选项可以获取年
的星期数**select datepart(week,getdate())**
答案 20 :(得分:0)
仅当您在选择列表中表示该月的每一周时,以下内容才有效。否则排名函数将不起作用,但这是一个很好的解决方案。
SELECT DENSE_RANK() OVER (PARTITION BY MONTH(DATEFIELD)
ORDER BY DATEPART(WEEK,DATEFIELD) ASC) AS WeekofMont
答案 21 :(得分:-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
答案 22 :(得分:-1)
select @DateCreated, DATEDIFF(WEEK, @DateCreated, GETDATE())