我有一张这样的表:
id: PK bigint
RatePercent: decimal(4, 4)
DateRange: date
我正在尝试按如下方式填充表格:
不幸的是,我的查询不会这样做而且一直说
操作数类型冲突:日期与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
答案 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
与使用CURSOR
或WHILE
循环相比,它更快。