考慮創建一個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';
除了eventDate嗎? – 2011-02-25 10:57:54
你已經用'php'標記了這個 - 用php這樣的程序語言來實現這個過程非常簡單,而且對於像SQL這樣的聲明性語言而言(相對)非常困難。使用PHP! – simon 2011-02-25 10:59:44
我希望活動日期是唯一改變的事情 – Simon 2011-02-25 11:00:24