我有一个来自SQL查询的复杂日历报告,其中我有年,月和WeekNumOfMonth(表示从月初开始的周数)。
我需要一个函数来返回给出Year,month和WeekNumOfMonth的DayOfMonth(即:1-28,29,30或31之间的值,具体取决于月份)。
我看过从年初开始给予WeekNum的函数,但我只有给定月份的WeekNum。我似乎无法正确地给出datePart和dateAdd函数。任何帮助将不胜感激。
答案 0 :(得分:0)
注意:年,月,周数的组合不会给你 日名,因为一周包含一天以上,所以你怎么找到 哪一天呢?这是不可能的
示例: year 2015 month 06 week number 1
然后它有
的组合1 monday
2 tuesday
3 wednesday
4 thursday
5 friday
6 saturday
然后用这些结果你怎么能预测到确切的一天?
否则需要一些条件或限制
如果您有年,月和日期,那么您可以使用以下查询找到日期名称,它将给出一周的开始和结束日期,然后您可以从开始日期和结束日期结束日期
SELECT (
DATENAME(dw,
CAST(DATEPART(m, GETDATE()) AS VARCHAR)
+ '/'
+ CAST(DATEPART(d, '2015-06-23') AS VARCHAR)
+ '/'
+ CAST(DATEPART(yy, getdate()) AS VARCHAR))
)
更新
如果您需要当周之间的所有日期,请使用以下查询
DECLARE
@Year INT,
@Week INT,
@FirstDayOfYear DATETIME,
@FirstMondayOfYear DATETIME,
@StartDate DATETIME,
@EndDate DATETIME
SET @Year = 2015
SET @Week = 24// week number is based on year and it is not based on month
-- Get the first day of the provided year.
SET @FirstDayOfYear = CAST('1/1/' + CAST(@YEAR AS VARCHAR) AS DATETIME)
-- Get the first monday of the year, then add the number of weeks.
SET @FirstMondayOfYear = DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, @FirstDayOfYear), @FirstDayOfYear)), 0)
SET @StartDate = DATEADD(WEEK, @Week - 1, @FirstMondayOfYear)
-- Set the end date to one week past the start date.
SET @EndDate = DATEADD(WEEK, 1, @StartDate)
SELECT @StartDate AS StartDate, DATEADD(SECOND, -1, @EndDate) AS EndDate
<强>更新强>
如果没有年份周数,则使用以下查询
DATEPART(WEEK,'2015-06-01')
以上查询是一个例子
在查询中,您有两个Year
和Month
您只需要第三个值,即日期
作为一种技术,你可以给01作为日期然后它会给出 开始周编号您选择的月份
这里结果是23,所以你在 2015 - 月06开始第23周时就有了这个想法,那么你可以很容易地做你的东西
想法:如果您的周数是1,那么如果它是2那么每周需要23,那么24就像明智一样..