【问题标题】:SQL While loop out of sortsSQL While 循环不正确
【发布时间】:2013-01-17 05:28:21
【问题描述】:

尝试使用 while 循环将日期数据类型输入到表中。我的循环中断不起作用,输入值显示为 NULL。

非常感谢您的帮助

DECLARE @StartDate DATE
DECLARE @countIndex INT
DECLARE @yearDate DATE
DECLARE @todaysDate DATE
SET @StartDate = GETDATE()
SET @yearDate = DATEADD(YEAR, 1,@StartDate)

CREATE TABLE DateLookup
    (
    DateID INT IDENTITY (1,1),
    DateDescription Date
    )

 WHILE (DATEDIFF(DD,@StartDate, @yearDate)) <= 366   
 BEGIN

    SET @countIndex = @countIndex +1

    INSERT INTO DateLookup (DateDescription)
    VALUES (DATEADD (DD,@countIndex,@todaysDate))--DAY(GETDATE()))

    IF (@countIndex < 366)
        Break

END

【问题讨论】:

    标签: sql if-statement while-loop create-table


    【解决方案1】:

    如果您只需要在 DateLookup 表中插入接下来的 365 天,为什么不使用这样的东西(假设您指的是 SQL Server,取决于您的 RDBMS):

    INSERT INTO DateLookup  (DateDescription)
    SELECT DATEADD(DD,Number,GETDATE())
    FROM master..spt_values 
    WHERE Number BETWEEN 1 AND 365 AND Type = 'P'
    

    这里是SQL Fiddle

    祝你好运。

    【讨论】:

      【解决方案2】:

      你从未将@countIndex 设置为 0;它是 NULL,这意味着当您向其添加 1 时它始终为 NULL。 @todaysDate 也有同样的问题。

      如果你想完全避免 WHILE 循环,你可以像这样将一些东西拼凑在一起:

      ; WITH    seed
                AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY name ) AS n
                     FROM     sys.columns
                   )
          SELECT TOP 366
                  DATEADD(Day, n - 1, GETDATE())
          FROM    seed
      

      【讨论】:

      • 这不一定会给你 365​​ 天——看我的回答——这取决于你的 sys.columns 表中有多少行。祝你好运。
      【解决方案3】:

      你需要DECLARE @todaysDate DATE = getdate()DECLARE @countIndex INT = 0

      另外,你的意思可能是IF (@countIndex &gt; 365) BREAK

      【讨论】:

      • +1 。 . .我错过了这个答案,我认为这是正确的答案。
      猜你喜欢
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多