2011-02-25 59 views
0

我需要運行一個語句,每次除了日期之外都會使用相同的信息填充數據庫。循環使用日期的SQL插入語句

即時通訊正在嘗試沿着這些線路,並沒有任何運氣。

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

除了eventDate嗎? – 2011-02-25 10:57:54

+1

你已經用'php'標記了這個 - 用php這樣的程序語言來實現這個過程非常簡單,而且對於像SQL這樣的聲明性語言而言(相對)非常困難。使用PHP! – simon 2011-02-25 10:59:44

+0

我希望活動日期是唯一改變的事情 – Simon 2011-02-25 11:00:24

回答

1

你可以嘗試DATEADD(ms,i_int,GETDATE())您的日期。

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的),你可以這樣做是爲了增加一天類型爲「戳」的變量。

this_date = this_date + interval '1 day'; 

而在INSERT語句,

INSERT INTO bs_events (eventDate, ...) 
VALUES (this_date, ...); 

檢查您的文檔,看語法可能是什麼您的平臺。

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; 
/
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,財政年度,假期,假日名稱,日期名稱,季度,季度。對於非標準時期,這是黃金。

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