SQL:无法在列中插入日期循环

时间:2015-07-23 07:50:02

标签: sql-server

我有一张这样的表:

id: PK bigint
RatePercent: decimal(4, 4)
DateRange: date

我正在尝试按如下方式填充表格:

  • RatePercentage,全部为0.12
  • 从&01; 01-01-2015开始的日期'到' 12-31-2099'

不幸的是,我的查询不会这样做而且一直说

  

操作数类型冲突:日期与int

不兼容

我还没有从id bigint中分配一个int数据类型。我有点困惑。

到目前为止,这是我的查询:

DECLARE @Date Date
SET @Date = '01-01-2015'

WHILE @Date <= '12-31-2099'
BEGIN
    INSERT INTO [dbo].[IMF_Main_VATHistory] (VATRate, VATDate)
    VALUES (0.12, @Date + 1);
END

3 个答案:

答案 0 :(得分:4)

试试这个:

DECLARE @Date Date
SET @Date = '01-01-2015'

WHILE @Date <= '12-31-2099'
BEGIN
    INSERT INTO [dbo].[IMF_Main_VATHistory] (VATRate, VATDate)
    VALUES (0.12, DATEADD(DAY, 1, @Date));

    SET @Date = DATEADD(DAY, 1, @Date);
END

您无法在SQL Server中直接添加DATE数据类型(供参考,我认为您可以在Oracle中)。您必须使用函数才能修改DATE / DATETIME变量(或列)。

以下是SQLFiddle示例。

答案 1 :(得分:3)

问题在于你“@Date + 1”我认为 - SQL-Server喜欢尝试转换为INT:)

使用可行的DATEADD

DECLARE @Date Date
SET @Date = '01-01-2015'

WHILE @Date <= '12-31-2099'
BEGIN
    INSERT INTO [dbo].[IMF_Main_VATHistory] (VATRate, VATDate)
    VALUES (0.12, @Date);
    SET @Date = DATEADD(DAY, 1, @Date);
END

答案 2 :(得分:2)

我建议不要使用任何基于循环或 RBAR 的解决方案。您可以在Tally Table的帮助下使用基于集合的方法执行此操作。

DECLARE @startDate DATE
DECLARE @endDate DATE

SET @startDate  = '20150101'
SET @endDate = '20991231';


WITH E1(N) AS(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
),
E2(N) AS(SELECT 1 FROM E1 a, E1 b),
E4(N) AS(SELECT 1 FROM E2 a, E2 b),
E8(N) AS(SELECT 1 FROM E4 a, E4 b),
Tally(n) AS(
    SELECT TOP(DATEDIFF(DAY, @startDate, @endDate) + 1)
        ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
    FROM E8
)
INSERT INTO IMF_Main_VATHistory(RatePercent, DateRange)
SELECT 
    0.02, DATEADD(DAY, N-1, @startDate)
FROM Tally

与使用CURSORWHILE循环相比,它更快。