如何根据给定的年数生成每周日期

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 year2 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 组件有点奇怪...这可以根据第一个查询中的旋转分配来完成。但是,我不想在不了解“共享”的目的的情况下将其混淆给您。它几乎看起来像某种旋转队列。

【讨论】:

以上是关于如何根据给定的年数生成每周日期的主要内容,如果未能解决你的问题,请参考以下文章

MVVM 自动生成编号

MVVM 自动生成编号

MVVM 自动生成编号

如何获得一定秒数的年数、月数、天数、小时数和分钟数?

如何实现秒数和日期之间的转换

如何在 django 1.11 中查找给定月份每周的记录数?