【问题标题】:writing a row for each day. mySQL每天写一行。 mysql
【发布时间】:2013-09-16 14:32:33
【问题描述】:

我有一个网络表单,用户输入两个日期 (YYYY/MM/DD) 代表一个时间间隔和关于一天活动的其他信息。

示例:他选择 2013/09/12 至 2013/10/02 活动:游泳

在这种情况下,我的表格将如下所示:

   date     |  activity
2013/09/12  |  swimming
2013/09/13  |  swimming
2013/09/14  |  swimming
2013/09/15  |  swimming
2013/09/16  |  swimming

等等……

我必须为用户提供的日期的每一天写一行活动

我可以在不手动迭代几天的情况下做到这一点吗? 我正在使用 php+mysqli

编辑:我不能使用两列来表示开始日期和结束日期

【问题讨论】:

  • 如何在数据库中存储数据?
  • 不清楚您在问什么...您是要检索数据还是询问表架构?
  • 不,我必须将数据写入 DB 我的表看起来像我的 axample 中的表加上自动生成的数字 ID 和带有附加信息的另一个字段。正如我所说,用户通过网络表单提供了两个日期,代表一个时期的开始和结束以及一个活动
  • 尝试使用时间戳...。我相信这会对你有所帮助

标签: php mysql date loops mysqli


【解决方案1】:

我认为最好制作两列(例如 start_day 和 end_day)。

如果无法更改您的数据库结构,您可以试试这个:

PHP:

$last_date = $start_date;
$ready = false;
while ($ready === false) {
    $last_date = date('Y-m-d', strtotime($last_date . ' + 1 day'));+

    // add $last_date to your mysql table here

    if ($last_date == $stop_date) {
      $ready = true;
    }
}

它未经测试,但我希望它有效;)

【讨论】:

  • 不幸的是我没有足够的声誉来做这件事:/
  • 不幸的是我不能使用两列。数据库已经存在,我无法更改它
【解决方案2】:

在表格中使用 2 个不同的日期列;一个用于开始日期,一个用于结束日期,然后您可以将活动的开始日期和结束日期分别添加到每个日期。

【讨论】:

  • 不幸的是我不能使用两列。数据库已经存在,我无法更改它
  • @JacopoGrassi 我猜您可以使用当前的date 列作为字符串并将日期范围存储在该列中?如:2013/09/12-2013/10/02.
  • 不是真的...该字段是 DATE 字段,因此我无法在其中存储字符串。除此之外,还有其他应用程序使用此数据库,我无法编辑字段并重写所有其他应用程序以使用新表。
  • @JacopoGrassi 那么您当前的方法似乎是唯一的方法。尽管为您的新应用创建一个单独的表并在需要时将它们链接起来对您来说会更有益。
【解决方案3】:

如果你可以使用PROCEDURES,我可以给你一个线索:

DELIMITER $$

DROP PROCEDURE IF EXISTS `dowhile_thing`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `dowhile_thing`(dt_start DATE,dt_stop DATE, thing CHAR(20))
BEGIN
  DECLARE v1 INT DEFAULT 0;
CREATE TEMPORARY TABLE tmp (
  `day_name` VARCHAR(256) DEFAULT NULL,
  `date_change` DATE DEFAULT NULL,
  thing CHAR(20)
) ENGINE=MYISAM DEFAULT CHARSET=utf8  ;  


  SELECT TIMESTAMPDIFF(DAY, dt_start, dt_stop)+1  INTO v1;
  WHILE v1 > -1 DO
    INSERT tmp (SELECT DAYNAME( ADDDATE(dt_start, INTERVAL v1 DAY) ),ADDDATE(dt_start, INTERVAL v1 DAY),thing );
    SET v1 = v1 - 1;
  END WHILE;

SELECT * FROM tmp;  
DROP TEMPORARY TABLE IF EXISTS tmp;  

    END$$

DELIMITER ;

然后调用:

CALL dowhile_thing('2013-06-10','2013-06-14','swim');

结果:

日期名称 |日期更改 |东西

星期六 | 2013-06-15 |游泳

星期五 | 2013-06-14 |游泳

...

【讨论】:

    猜你喜欢
    • 2016-05-04
    • 1970-01-01
    • 2021-05-20
    • 2017-10-14
    • 1970-01-01
    • 2017-05-14
    • 2016-06-13
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多