循环使用日期SQL INSERT语句循环使用日期SQL INSERT语句(looping a SQL

2019-05-12 10:47发布

我需要运行,将每次填充数据的基础上相同的信息除了日期的声明。

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个月的运行该脚本。

Answer 1:

考虑创建一个日历表 。

我在我的工作与任何数据库创建的第一个表,是一个数字表,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';


Answer 2:

你可以尝试DATEADD(ms,i_int,GETDATE())为你的约会。



Answer 3:

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, ...);

请检查您的文档,看语法可能是什么您的平台。



Answer 4:

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;
  /


文章来源: looping a SQL insert statement with dates