创建日期表的SQL函数

时间:2018-09-11 21:13:45

标签: sql function date

此函数返回单个日期,而不是预期的61个日期的列表。有什么想法我做错了吗?

alter FUNCTION udf_foo()
RETURNS  @Result TABLE
(
days datetime
)

AS
begin
DECLARE @i int = -1
begin
WHILE @i < 60
SET @i = @i + 1
INSERT into @Result select  dateadd (day, -@i, getdate())
end ;
return;
end

2 个答案:

答案 0 :(得分:2)

就像您编写它一样,WHILE循环的主体仅跨越下一条语句。

您只会得到一个结果,因为INSERT不是循环主体的一部分,并且只执行一次(在循环将@i增大为60之后)。

如果要包含一个以上的语句主体,请将这些语句括在BEGIN ... END块中。

...
WHILE @i < 60
BEGIN
  SET @i = @i + 1;
  INSERT INTO @Result
              SELECT dateadd(day, -@i, getdate());
END;
...

答案 1 :(得分:1)

您可以为此使用CTE:

with dates as (
      select cast(getdate() as date) as dte
      union all
      select dateadd(day, -1, dte)
      from dates
      where dte >= dateadd(day, -60, getdate())
     )
select *
from dates;

您几乎不需要此功能,尽管如果您确实愿意可以将其放入功能中。

Here是将其合并到视图中的示例。