0

嗨,我有一个表 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。

请帮助我。

4

2 回答 2

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 提供的星期编号。

更新

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 是一年中的某一天除以七,然后再除以四,只剩下模数。

于 2012-05-02T14:04:48.943 回答
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

现场测试:http ://www.sqlfiddle.com/#!3/e4837/12

于 2012-05-02T14:14:53.300 回答