我需要运行,将每次填充数据的基础上相同的信息除了日期的声明。
IM目前正试图沿着这些路线的东西,没有任何运气。
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;
/
我似乎无法得到它的工作和IM停留在代码洞,想不清楚。
我基本上要日期由一个从01-30到了,然后我将手动更改月份,再次对所有一年12个月的运行该脚本。
考虑创建一个日历表 。
我在我的工作与任何数据库创建的第一个表,是一个数字表,1〜1000000。这样的表是许多用途,如在SQL执行循环很有用。 此外,它可以被用来生成我与我共事的任何数据库上创建第二个表:日历表。
日历表有一行每日期,开始在你的数据库(加上一年左右)第一记录的业务活动。 未来保留所有相关的业务查询(加上几年是安全的)足够的日期。
您的具体问题可与上面的表格来解决,但日历表的做法会容易得多。
我给你在下面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开始。(这听起来很慢,但它实际上在10秒在我2岁的笔记本电脑就完成了)。
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,季度,第三级。 对于非标准的时期,这是金。
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;
完成。 你也许可以看到你可以只用数字表已经解决问题了吗?
最后,这里是如何使用的日历表来解决您的具体问题的例子。 如果添加列年和月这当然会是更容易。 在这里,我解释你的问题表示“产生一个相同的行每个月的每一天,在今年余下的时间”。
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';
你可以尝试DATEADD(ms,i_int,GETDATE())
为你的约会。
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的),你可以这样做是为了增加一天类型为“戳”的变量。
this_date = this_date + interval '1 day';
而在INSERT语句,
INSERT INTO bs_events (eventDate, ... )
VALUES (this_date, ...);
请检查您的文档,看语法可能是什么您的平台。
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;
/