2013-04-10 101 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