我正在编写一些与创建定期发票有关的 php 代码。我需要一些帮助来思考逻辑。我想最终我会得到一种 Insert/Select 语句。最终生成的 php 代码将在夜间 cron 中运行。
首先,让我向您展示一些表格项目作为引用框架,并解释一下它们的作用。该表称为“发票”,还有其他与之关联的表,但我想如果我现在可以确定这个表的逻辑,我就可以将其应用到其他表。
ID = 这是自动递增的主键,也恰好是发票号码。
定期 = 这是发票是一次性的还是定期的。 O=一次,M=每月等等
recurred = 这将在插入时设置为 N,这是我用来查看将在表中创建的下一个经常性发票是否应基于此发票的逻辑。当新的定期发票插入表中时,这将更改为 Y,因此 cron 作业不会再次处理它。
日期 = 这是插入/创建发票的日期。例如,如果发票创建日期是本月 15 日,则创建的下一张发票将是下个月 15 日。本质上M代表每月。但是,我还没有弄清楚如何处理 31 日的创建日期,但下个月只有 30 天,可以在这里使用一些帮助。
这是我的逻辑。首先,我运行一个查询来查找所有非 O 且 recurred = N 的行。
$result = mysql_query("SELECT * FROM invoice WHERE recurring != 'O' and recurred
= 'N'") 或 die(mysql_error());
接下来,我会研究各种循环 M(每月)、Q(季度)等等。
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.) 如何创建一个插入选择语句来处理更改的变量,以及 2.) 如果发票是在一个月的 31 号创建的,而下个月只有 30 号,则如何处理日期天(或 28)。
最佳答案
仅获取需要重新插入的行:
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 日的问题。
现在插入新创建的数据。
另外,最好的建议是使用枚举来重复字段,使用 bool 值来重复字段。
关于php - 插入select语句,更改字段和逻辑思维,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934860/