如何根据给定的年数生成每周日期
Posted
技术标签:
【中文标题】如何根据给定的年数生成每周日期【英文标题】:How to generate the week to week dates based on given number of years 【发布时间】:2016-04-08 01:57:15 【问题描述】:我正在尝试将开始日期和结束日期值写入数据库。
我在这里调用这个创建共享日期函数来向数据库添加值。
当我调用这个函数时
函数 1st 获取 $sharing
值。 $sharing
的值将是“1 week
”或“2 week
”或“3 week
”...
$from_date
将包含一个日期值。
$product_life
的值类似于 1 year
或 2 year
...
我想在迭代中将值添加到数据库中。说。
我有一个$product_life = 1 year
,我有一个from_date = 2016-02-23
,还有sharing_basis= 1 week
当我使用上述值调用createSharingdates($productId)
时,它将通过order_datetime
获取该产品的用户,然后为每个用户添加共享日期。但在这里我只能生成1 个周期的共享日期。
For.ex 如果有 4 个用户,我只能为 4 个用户生成一次日期。 喜欢
user_id: 1
product_id: 24
start_date: 2015-02-02
end_date: 2015-02-09
user_id: 2
product_id: 24
start_date: 2015-02-10
end_date: 2015-02-17
user_id: 3
product_id: 24
start_date: 2015-02-18
end_date: 2015-03-26
user_id: 4
product_id: 24
start_date: 2015-02-27
end_date: 2015-03-05
我想做的是生成共享日期直到product_life
结束
例如:
如果产品寿命有product_life
作为一年,我想在共享基础上生成那一年的日期。这样输出就会像..
输出:
user_id: 1
product_id: 24
start_date: 2015-02-02
end_date: 2015-02-09
user_id: 2
product_id: 24
start_date: 2015-02-10
end_date: 2015-02-17
user_id: 3
product_id: 24
start_date: 2015-02-18
end_date: 2015-02-26
user_id: 4
product_id: 24
start_date: 2015-02-27
end_date: 2015-03-05
user_id: 1
product_id: 24
start_date: 2015-03-06
end_date: 2015-03-13
user_id: 2
product_id: 24
start_date: 2015-03-14
end_date: 2015-03-21
user_id: 3
product_id: 24
start_date: 2015-03-28
end_date: 2015-03-35
user_id: 4
product_id: 24
start_date: 2015-03-42
end_date: 2015-03-49
... continues
代码:
function createSharingdates($productId)
$sharing_basis = getSharingBasis($productId);
$product_life = getlife($productId);
$from_date = getStartdate($productId);
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($conn->connect_error)
die("Connection failed: " . $conn->connect_error);
$sql = "SELECT user_id FROM orders WHERE product_id='$productId' ORDER BY order_datetime";
$result = $conn->query($sql);
if ($result->num_rows > 0)
$product_id = $productId;
while($row = $result->fetch_assoc())
$user_id = $row["user_id"];
$to_date = date('Y-m-d', strtotime('+'.$sharing_basis, strtotime($from_date)));
addSharingDates($product_id,$user_id,$from_date,$to_date);
$from_date = $to_date;
$conn->close();
【问题讨论】:
您需要在可用的几周内创建一个循环(从$from_date
到$product_life
),在每个轮次中获取下一个用户(您可能希望将其放入一个数组中,这样您就可以轻松从一个到下一个,到达终点时回到起点)。 php DateTime 类将帮助您获取开始和结束日期。
【参考方案1】:
Starting with a similar link 用户想要给定范围内的所有可能日期,但没有固定的日期表。您可以在查询中动态生成一个表,然后将其用作其余查询/用户的基础...例如,从 2015-02-02 开始获得 52 周...您显然可以更改任何开始日期是,并根据需要根据多少个 LIMIT 记录(26 周、52 周、104 周等)限制结束。
select
@curDate := Date_Add(@curDate, interval 1 day) as WeekStart,
Date_Add( @curDate, interval 7 day ) as WeekEnd
from
( select @curDate := '2015-02-02' ) sqlvars,
AnyOtherTable
limit 52 ) AllWeeksYouNeed
现在,您想获取购买给定产品的所有用户的交易,只需将两个结果连接起来即可。
SELECT
o.user_id,
o.Product_ID,
AllWeeksYouNeed.WeekStart,
AllWeeksYouNeed.WeekEnd
FROM
orders o
JOIN ( above entire query ) AllWeeksYouNeed
WHERE
o.product_id='$productId'
ORDER BY
o.order_datetime
这将创建一个笛卡尔结果,我认为这不是您想要的...但它会根据您可以调整的持续时间(1 年、2 年等)每周为您提供每人一条记录。
现在,SHARING 组件有点奇怪...这可以根据第一个查询中的旋转分配来完成。但是,我不想在不了解“共享”的目的的情况下将其混淆给您。它几乎看起来像某种旋转队列。
【讨论】:
以上是关于如何根据给定的年数生成每周日期的主要内容,如果未能解决你的问题,请参考以下文章