我需要运行一个语句,每次除日期之外,将使用相同的信息填充数据库。
我目前正在尝试这些方面并没有任何运气。
DECLARE
i_int BINARY_INTEGER := 1;
BEGIN
WHILE i_int <= 30 LOOP
INSERT INTO bs_events (eventDate,eventTime,title,spaces,description,entryFee,payment_required,max_qty,allow_multiple) VALUES ('2011-03-i_int 00:00:00', '10:00','Carpet Cleaner 3000','4','This is rad','25.99','1','1','2');
i_int := i_int + 1;
END LOOP;
END;
/
我似乎无法让它工作,我陷入了代码洞,无法直接思考。
我基本上希望将日期从01-30提高一个,然后我将手动更改月份,并在一年中的所有12个月再次运行脚本。
答案 0 :(得分:4)
考虑创建Calendar table。
我在我使用的任何数据库中创建的第一个表是一个数字表,1到1000000.这样的表有很多用途,比如在SQL中实现循环。此外,它可用于生成我在我使用的任何数据库上创建的第二个表:Calendar表。
日历表每个日期都有一行,从数据库中第一个记录的业务事件开始(加上一年左右)。为所有相关业务查询保留足够的未来日期(加上几年安全)。
您可以使用上述任一表格解决您的具体问题,但日历表方法会更容易。
我将在MySQL下面给你一个简单但有效的例子:
create table digits(n int);
insert into digits values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table numbers(
n int not null
,primary key(n)
);
数字表只是一个工作表,一旦创建了实数表,它就会被删除。数字表只有一列,它是主键。接下来,从1开始生成100万个连续的整数。(听起来很慢,但实际上在我2岁的笔记本电脑上不到10秒就完成了。)
insert
into numbers(n)
select 1
+ (d1.n * 1)
+ (d2.n * 10)
+ (d3.n * 100)
+ (d4.n * 1000)
+ (d5.n * 10000)
+ (d6.n * 100000) as n
from digits d1
,digits d2
,digits d3
,digits d4
,digits d5
,digits d6;
/* Drop the working table. */
drop table digits;
接下来,我将创建一个日历表。显然它目前没用,因为它没有任何有用的列。有用列的示例包括年,月名,周数,isFirstMonthDay,isLastMonthDay,财务年度,isHoliday,Holidayname,dayname,quarter,tertial。对于非标准时期,这是金色的。
create table calendar(
datum date not null
,primary key(datum)
);
好的,现在我们可以使用数字表作为行生成器来构建我们的日历表。假设我要生成2000-01-01和2019-12-31之间的所有日期。那将是7305天。简单,只需从数字表中选择多行,然后将int列N
添加到日期。这将创建一个日期增加的列表。
insert
into calendar(datum)
select date_add('1999-12-31', interval n day)
from numbers
where n <=7305;
完成。您可以通过使用数字表来了解如何解决问题?
最后,这是一个如何使用日历表解决您的特定问题的示例。如果添加Year和Month的列,当然会更容易。在这里,我将您的问题解释为“为每个月的每一天生成一个相同的行,在一年中的其余时间”。
insert
into bs_events(
eventDate, eventTime, title
,spaces, description, entryFee
,payment_required, max_qty, allow_multiple
)
select datum, '10:00', 'Carpet Cleaner 3000'
,'4', 'This is rad', '25.99'
,'1', '1', '2'
from calendar
where datum >= date '2011-03-01'
and datum <= date '2011-12-31';
答案 1 :(得分:1)
您可以尝试DATEADD(ms,i_int,GETDATE())
为您的约会。
答案 2 :(得分:0)
INSERT INTO bs_events (eventDate, ... )
VALUES ('2011-03-i_int 00:00:00', ...);
此值2011-03-i_int 00:00:00
是一个字符串,而不是时间戳。您希望您的SQL环境将i_int的值替换为其符号。它不会那样做。
相反,在INSERT语句之外执行日期算术。
在PostgreSQL(PL / pgsql)中,你可以这样做,为“timestamp”类型的变量添加一天。
this_date = this_date + interval '1 day';
在INSERT语句中,
INSERT INTO bs_events (eventDate, ... )
VALUES (this_date, ...);
查看您的文档,了解您的平台的语法。
答案 3 :(得分:0)
DECLARE
i_int BINARY_INTEGER := 0;
BEGIN
WHILE i_int < 30 LOOP
INSERT INTO bs_events (
eventDate, eventTime, title,
spaces, description, entryFee,
payment_required, max_qty, allow_multiple)
VALUES (
DATEADD(day, i_int, '2011-03-01 00:00:00'), '10:00', 'Carpet Cleaner 3000',
'4', 'This is rad', '25.99',
'1', '1', '2');
i_int := i_int + 1;
END LOOP;
END;
/