【问题标题】:PHP and MySql with date problem...?PHP 和 MySql 有日期问题...?
【发布时间】:2011-08-12 20:11:48
【问题描述】:

在我的项目中,我使用了一个名为“补偿”的表格,例如.....

+--------------------------------------------------------------+
| Id  |  receiver_Id   |  compensation   |      date           | 
|--------------------------------------------------------------|
| 1   |  5             |  50%            | 2011-02-15 12:15:00 | 
| 2   |  3             |  40%            | 2011-04-05 18:35:00 |
| 3   |  3             |  30%            | 2011-04-25 06:24:00 | 
| 4   |  5             |  45%            | 2011-04-21 19:05:00 |
| 5   |  5             |  60%            | 2011-04-30 12:05:00 |
.......................

这里是date represents that the compensation is changed on that particular date。对于receiver 5,补偿为 50%before Feb 15 2011. And the compensation is45%fromthe date2011 年 2 月 15 日 12:15:01 至 2011 年 4 月 21 日 19:05:00`。等等……

在这里,当我为月份 APRIL 2011receiver 5 创建 invoice 时,我必须使用 compensation as 45% 直到日期 21 April 201122 April 2011 to 30 April 2011 I have to use 60% 作为补偿...

但是如何获得一个月或两个日期之间的补偿,因为补偿可能在一个月内多次修改,如 id 4 和 5 所示......

请帮我writing SQL 完成上述操作,或者我必须在table structure 上创建changes 以使其简单......?

提前致谢

【问题讨论】:

    标签: php mysql zend-framework select


    【解决方案1】:

    实际上您的日期列看起来更像是日期时间类型而不是日期:

    select * from yourtable where date between 'yourfirstdate' and 'yourlastdate'
    

    但是请注意,如果您在日期中指定较窄的间隔,那么您的查询将无法返回任何结果(即使使用 Sander Marechal 原始解决方案),因此更好的选择是检查较大的间隔或始终查询 10 个最新行并应用代码级别的日期过滤。

    【讨论】:

    • 这不起作用。例如,您的查询将在 3 月份(2011 年 3 月 1 日至 2011 年 3 月 31 日)为收件人 5 提供零结果,而实际上它应该返回行 ID 1。
    • 它的工作方式就像它应该在日期范围之间给出结果,而不是像我解释的那样超出范围。正如我现在所看到的,您已经修改了查询以反映该更改
    • 不,这行不通。 SELECT * FROM compensations WHERE date BETWEEN 2011-03-01 AND 2011-03-31 -> 0 rows returned。根据 OP 的描述,正确的行为应该返回行 ID 1
    【解决方案2】:

    第一个 sql 将获取当前月份/年份

    第二个 sql 显示它使用特定的月份/年份进行硬编码

    SELECT * FROM compensations
        WHERE YEAR(date) = YEAR(NOW()) AND MONTH(date) = MONTH(NOW());
    
    
    SELECT * FROM compensations
        WHERE YEAR(date) = '2011' AND MONTH(date) = '4';
    

    【讨论】:

      【解决方案3】:

      当您的表格同时跟踪有效起始日期和有效截止日期时,这会容易得多:

      +--------------------------------------------------------------+---------------------+
      | Id  |  receiver_Id   |  compensation   |      date_from      |      date_to        |
      |--------------------------------------------------------------|---------------------|
      | 1   |  5             |  50%            | 2011-02-15 12:15:00 | 2011-04-21 19:05:00 | 
      | 2   |  3             |  40%            | 2011-04-05 18:35:00 | 2011-04-25 06:24:00 | 
      | 3   |  3             |  30%            | 2011-04-25 06:24:00 | 0000-00-00 00:00:00 | 
      | 4   |  5             |  45%            | 2011-04-21 19:05:00 | 2011-04-30 12:05:00 | 
      | 5   |  5             |  60%            | 2011-04-30 12:05:00 | 0000-00-00 00:00:00 |
      .......................
      

      然后就可以查询了:

      SELECT * FROM compensations
          WHERE (date_to > $start_of_month OR date_to = 0 )
          AND date_from < $end_of_month;
      

      【讨论】:

      • 好吧 date_from 和 date_to 与在 BETWEEN 子句中为同一字段提供前后参数相同,如果补偿没有改变,那么它是当前有效的补偿。最新日期在此结构中始终有效,因此无需更改结构
      • +1。但我会选择SELECT * FROM compensations WHERE NOW() BETWEEN date_from AND date_to
      • @Nemoden:OP 想要查询适用于整个月的所有行,而不是那些只适用于单个时刻的行(如 NOW())
      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      相关资源
      最近更新 更多