0

我正在尝试创建一个未来日期表。使用 while 循环很容易做到,但我知道这不是在 SQL 中最有效的方法。所以我希望有人可以分享一些关于如何以 SQL 集为基础的方式来做到这一点的想法。

这是我的代码:

declare @count int, @dd date
set @count=0;
set @dd ='01/04/2013';
while (@count<24)
  begin
    select @dd=dateadd(week, 2,@dd);
    set @count=@count+1;
    select @dd
  end

先感谢您...

4

2 回答 2

1

可能最好的方法是使用固定的日历表;继续创建一个永久表,其中包含处理日期逻辑所需的所有业务规则。

作为一种解决方法,您可以执行以下操作(假设您的数据库中有超过 24 列):

DECLARE @dd DATE
SET @dd = '01/04/2013';

SELECT TOP 24 DATEADD(week, 2*rn, @dd) 
FROM (SELECT rn=(ROW_NUMBER() OVER (ORDER BY name)) -1
        FROM sys.columns) c
于 2013-07-29T16:22:12.513 回答
0

我们对数据仓库做类似的事情。这是一个两阶段的操作。一是只添加主键字段的新记录,二是更新新记录的其他字段。数据库引擎是redbrick。redbrick 语法类似于 sql server 语法。

这是插入查询:

insert into period (date)

select
    case when days_in_year((select max(date) from period))=365 -- current max year not leap year
    and days_in_year(dateadd(day,1,(select max(date) from period)))=365 --new year not leap year
    then dateadd(day,365,date)
    else dateadd(day,366,date)end

from period

where date between
    case when days_in_year(dateadd(day,1,(select max(date) from period)))=366 -- new year is leap year
    or days_in_year((select max(date) from period))=366 -- current max year is leap year
            then dateadd(day,-365, (select max(date) from period)) -- Dec 31 of year before current max year
            else dateadd(day,-364, (select max(date) from period)) end --Jan 1 of current max year

and

    case when days_in_year((select max(date) from period))=366 -- current max year is leap year
            then dateadd(day,-1, (select max(date) from period))-- Dec 30 of current max year
            else (select max(date) from period) end -- Dec 31 of current max year

and current_date > dateadd(month,-9,(select max(date) from period))

请注意,days_in_year 是一个红砖宏。在这种情况下,它相当于一个 sql server 用户定义的函数。相当于这个红砖代码

extract(dayofyear from date(concat(datename(year,%1),'-12-31')))

其中 %1 是传递给宏的参数。

于 2013-07-29T16:41:47.990 回答