嗨我有一个表格tab1,它有2列。值将如下所示
SL_NO CAL_DATE
807 2012-03-18
808 2012-03-19
....
1170 2013-03-16
我需要从这个表中选择sl_no的范围是807和1170.除此之外,我需要为week_no_of_month和week_no_of_year选择2个派生列。
week_no_of_month将在第1周下降7天,第2周接下来7天,如同一周期中的4周。然后它必须从第1周开始,直到每7天达到4个。
week_no_of_year将从1开始,每7天一直持续到52.
请帮助我。
答案 0 :(得分:1)
我不确定你到底需要什么。这将回答你的问题,但我怀疑这不是一个应该问的问题:
select datediff (day,
convert(varchar(4), year(CAL_DATE)) + '0101',
CAL_DATE) / 7 + 1 WeekOfYear,
(day(CAL_DATE) - 1) / 7 + 1 WeekOfMonth
您可以查看Sql Server提供的week numbering。
<强>更新强>:
declare @startOfFiscalYear as datetime
set @startOfFiscalYear = '20120318'
select datediff (day,
@startOfFiscalYear,
CAL_DATE) / 7 + 1 WeekOfYear,
((datediff (day, @startOfFiscalYear, CAL_DATE)) / 7 % 4) + 1 WeekOfMonth
WeekOfYear只是一年中的一天除以七。 WeekOfMonth是一年中的一天除以七,然后是四个离开模数。
答案 1 :(得分:1)
您是否尝试过内置的DATE_PART周,也许您可以使用它?
SELECT DATEPART( WEEK , 'May 2, 2012')
http://www.sqlfiddle.com/#!3/e93ae/2
回复:
这里的周数应该从第一条记录的1开始 我正在这个范围内取得。这不是正常的日历周 编号
试试这个:
SELECT
z.filter_date, x.d,
(datediff(day,z.filter_date, x.d) / 7) + 1 as week_number
from x
cross join (select convert(date,'march 7, 2012') as filter_date) as z
where x.d >= z.filter_date
数据:
create table x(i int identity(1,1) primary key, d date);
insert into x(d) values
('February 2, 2012'),
('February 5, 2012'),
('March 7, 2012'),
('April 8, 2012'),
('May 9, 2012'),
('June 9, 2012');
输出:
FILTER_DATE D WEEK_NUMBER
2012-03-07 2012-03-07 1
2012-03-07 2012-04-08 5
2012-03-07 2012-05-09 10
2012-03-07 2012-06-09 14