循环带有日期的SQL插入语句

时间:2011-02-25 10:56:04

标签: php sql database loops insert

我需要运行一个语句,每次除日期之外,将使用相同的信息填充数据库。

我目前正在尝试这些方面并没有任何运气。

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个月再次运行脚本。

4 个答案:

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