c#
/// <summary>
/// 获取指定日期为指定年月份的第几周
/// </summary>
public int GetWeekOfMonth(DateTime date)
{
DateTime firstDayInMonth = DateTime.Parse(string.Format("{0}-{1}-01", date.Year, date.Month));
//不计入本月周的总天数,如1号为星期五,则1、2、3都不计入将要计算的周内
int exceptDays = 0;
if (firstDayInMonth.DayOfWeek != DayOfWeek.Monday)
{
//+ 2的含义为计算时需要减去1号和date当天的日期
//如果不减去date当天,则当date为星期天时,则刚好在除7后为正确值,再加1就会多一周
exceptDays = 7 - (int)firstDayInMonth.DayOfWeek + 2;
}
//指定的日期减去不计算在周内的日期数
return (date.Day - exceptDays) / 7 + date.Day < exceptDays ? 0 : 1;
}
/// 获取指定日期为指定年月份的第几周
/// </summary>
public int GetWeekOfMonth(DateTime date)
{
DateTime firstDayInMonth = DateTime.Parse(string.Format("{0}-{1}-01", date.Year, date.Month));
//不计入本月周的总天数,如1号为星期五,则1、2、3都不计入将要计算的周内
int exceptDays = 0;
if (firstDayInMonth.DayOfWeek != DayOfWeek.Monday)
{
//+ 2的含义为计算时需要减去1号和date当天的日期
//如果不减去date当天,则当date为星期天时,则刚好在除7后为正确值,再加1就会多一周
exceptDays = 7 - (int)firstDayInMonth.DayOfWeek + 2;
}
//指定的日期减去不计算在周内的日期数
return (date.Day - exceptDays) / 7 + date.Day < exceptDays ? 0 : 1;
}
SQL:
DECLARE @Date DateTime
SET @Date = '2009-06-29'
SELECT CASE WHEN (DATEPART(WEEKDAY,CONVERT(DATETIME,CONVERT(VARCHAR(6),@Date,112) + '01')) - 1) = 1 THEN
(DATEPART(DAY, @Date) - (7 - (DATEPART(WEEKDAY,CONVERT(DATETIME,CONVERT(VARCHAR(6),@Date,112) + '01')) - 1) + 2)) / 7 +
CASE WHEN DATEPART(DAY,@Date) < (7 - (DATEPART(WEEKDAY,CONVERT(DATETIME,CONVERT(VARCHAR(6),@Date,112) + '01')) - 1) + 2) THEN 0 ELSE 1 END
ELSE DATEPART(DAY, @Date) / 7 + 1 END AS 'WeekOfMonth'
SET @Date = '2009-06-29'
SELECT CASE WHEN (DATEPART(WEEKDAY,CONVERT(DATETIME,CONVERT(VARCHAR(6),@Date,112) + '01')) - 1) = 1 THEN
(DATEPART(DAY, @Date) - (7 - (DATEPART(WEEKDAY,CONVERT(DATETIME,CONVERT(VARCHAR(6),@Date,112) + '01')) - 1) + 2)) / 7 +
CASE WHEN DATEPART(DAY,@Date) < (7 - (DATEPART(WEEKDAY,CONVERT(DATETIME,CONVERT(VARCHAR(6),@Date,112) + '01')) - 1) + 2) THEN 0 ELSE 1 END
ELSE DATEPART(DAY, @Date) / 7 + 1 END AS 'WeekOfMonth'