2013-04-10 102 views
0

我正在研究一些與創建定期發票有關的php代碼。我需要一些幫助來思考邏輯。我想最終我會得到一種Insert/Select語句。最終生成的php代碼將在夜間cron中運行。插入選擇語句,對字段和邏輯思維進行更改

首先,讓我向您展示一些我的表格項目以供參考,並解釋一下他們的工作。該表被稱爲發票,並且還有其他表與其相關聯,但我認爲如果我現在可以指定這個表的邏輯,我可以將它應用於其他表。

ID =這是自動遞增的主鍵,也恰好是發票號碼。

recurring =這是發票是一次還是反覆發生。 O =一次,M =每月等

recurred =這將在插入時設置爲N,並且是我用來查看錶中創建的下一個循環發票是否應基於此的邏輯發票與否。當新的循環發票被插入到表中時,這將被更改爲Y,以便不再由cron作業處理它。

date =這是發票被插入/創建的日期。例如,如果發票的創建日期是本月15日,則下一個發票將是下個月的15日。基本上M代表每月。然而,我還沒有想出如何處理31日的創建日期,但下個月只有30天,可以在這裏使用一些幫助。

所以這裏是我的邏輯。首先,我運行查詢以查找不在o所有的行和復發= N.

$result = mysql_query("SELECT * FROM invoice WHERE recurring != 'O' and recurred 

= 'N'「)或死亡(mysql_error());

接着,我在每個工作那種每月,Q季報等經常性的M ..

if recurring = M 
if todays date day = 'date' day 
    copy line item into a new row with the following changes: new ID, todays date, and mark the recurred to N for the new insert (will mark the old one Y) 

顯然是不實際的代碼,只是我在想什麼的。

所以我的問題是:1)如何創建插入選擇語句來處理chang ed變量和2.)如何處理髮票在一個月的31日創建並且下一個月只有30天(或28)的日期。

回答

1

採取只需要重新插入的行:

SELECT *, DATEDIFF(`date`, NOW()) as diff FROM invoice WHERE recuring != 'O' 
AND recured = 'N' AND diff >= 30; 

迭代通過列表,並通過計算其每行的新日期:

$newDate = date("Y-m-d", strtotime($oldDate+" +1 month")); 

這應該解決您的月的第30天問題。

現在插入新創建的數據。

此外,建議使用枚舉reculating字段,布爾值recured。

+0

謝謝,我會試試看。不知道什麼枚舉與布爾值意味着什麼。你能詳細說明嗎? – Tom 2013-04-10 21:08:59

+0

Avetis,我將不得不計算每月(M)季度(Q)半年一次(S)年度(A)的計算。你是否推薦我爲每種類型運行這個查詢,因爲你添加了diff> = 30?或者我應該運行一次,並得到一切,並與if語句排除? – Tom 2013-04-10 21:19:46

+0

關於enum和boolean,你使用字母O,Y,N,M作爲「字符串」來標識事物,這對數據庫不利,你應該根據邏輯改變類型,所以如果你需要yes/no如果你有幾個選項,比如monthly/quarterlu/daily,那麼字段類型應該是enum,在那裏你可以有確切的名字枚舉(每日,每月.eg),它將全部都是布爾(真/假)工作效率更高。 – 2013-04-10 21:46:20

0

我做了一些類似的應用程序。在我的情況下,我有兩個表:實際發票和經常性發票。定期表有一個名爲NextDate的字段 - 應創建下一個發票的日期。一次性發票直接添加到發票表中,否則cron作業將掃描循環表並檢查NextDate值。如果它在過去,那麼新發票將被生成到發票表中並且NextDate被更新(通常按月遞增)。

在我的情況下,通過增加每月只有1個月的變化值,例如在MySQL

DATE_ADD('2008-01-31', INTERVAL 1 MONTH) --> 2008-02-29 
+0

我喜歡nextdate領域的想法,可能會將它與Avetis的建議結合使用。 – Tom 2013-04-10 21:16:34

+0

當你倒退時會發生什麼?從2013年1月31日發票開始。下一張創建的發票是2013年2月28日。下一個將會是什麼樣子?它會是3-31-2013? – Tom 2013-04-10 21:31:33

+0

我認爲安全的賭注是使用原始日期(1-31-2013),並做INTERVAL 1,INTERVAL 2等 – Riho 2013-04-11 06:09:19