PHP和MySQL:将月和日与动态年

时间:2016-05-18 19:41:04

标签: php mysql date date-comparison

我正在处理我正在处理的应用程序时遇到一些麻烦,我希望得到一些指导。

我有一个简单的预订系统:每个项目都有一个标准价格,但有些时候价格可以改变。

例如:

  • 标准价格 100 /天

  • 从每年的Oct. 1stFeb. 1st,价格 80 /天

  • 从每年的Jun. 1stAug. 31st,价格 120 /天

  • [...] 最多6次不同的价格变动(季节)

因为这是一年一次,我只需要月和日,但我不知道如何将这些值存储在数据库中。我想要有两个字段,一个用于月份,一个用于包含数值的一天(01-12表示月份,01-31表示日期。这些值由用户自己设置,并且它们与项目本身相关,并不是每个人都固定的。

问题是,当有人预订时,我需要检查价格是否需要更改,我不明白如何构建查询来检查这一点。为了使maters最差,价格在预订期间可以有多个值。

按照上面的示例,如果我要预订从Sep. 1st (current year)Jul. 1st (next year)的商品,价格将如下:

  • 100 /天Sep. 1stSep. 30th

  • 80 /天Oct. 1stFeb. 1st

  • 来自Feb. 2nd to May 31st

  • 100 /天

  • 120 /天Jun. 1stJul. 1st

有没有办法检查这些案例而不必每天循环并检查数据库是否匹配?

谢谢

2 个答案:

答案 0 :(得分:2)

我不知道你的数据库表,但我认为你可以这样做:

  1. 获取您的期限,iniDay,iniMonth,endDay,endMonth
  2. 您的表需要包含以下字段:ini_day,ini_month,ini_daymonth,end_day,end_month,end_daymonth,price_day
  3. SELECT * from table WHERE iniDay >= booking_ini_day AND iniMonth >= booking_ini_month -- get initial period AND iniDay <= booking_end_day AND iniMonth <= booking_end_month UNION ALL SELECT * from table WHERE iniDay <= booking_ini_day AND iniMonth <= booking_ini_month -- get middle periods AND endDay >= booking_end_day AND endMonth >= booking_end_month UNION ALL SELECT * from table WHERE endDay >= booking_ini_day AND endMonth >= booking_ini_month AND endDay <= booking_end_day AND endMonth <= booking_end_month -- get end period
  4. 计算结果查询中每个期间/行的天数并显示给您的用户。
  5. 您将“复制”数据库信息,例如日,月和日,但这是为了获得更好的性能。

答案 1 :(得分:2)

您可以在查看日期时使用MySQL date_format功能。

例如:

select date_format('2016-05-18', '%m%d');
+-----------------------------------+
| date_format('2016-05-18', '%m%d') |
+-----------------------------------+
| 0518                              |
+-----------------------------------+
1 row in set (0,01 sec)

所以,你可以用简单的间隔检查:今天是0518,它在2月2日和5月31日之间:

  

0202&lt; = 0518&lt; = 0531

完整示例:

desc mytable;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| date_from | char(4) | YES  |     | NULL    |       |
| date_to   | char(4) | YES  |     | NULL    |       |
| price     | int(11) | YES  |     | NULL    |       |
+-----------+---------+------+-----+---------+-------+
3 rows in set (0,00 sec)

select * from mytable;
+-----------+---------+-------+
| date_from | date_to | price |
+-----------+---------+-------+
| 0901      | 0930    |   100 |
| 1001      | 0201    |    80 |
| 0202      | 0531    |   100 |
| 0601      | 0701    |   120 |
+-----------+---------+-------+
4 rows in set (0,00 sec)

示例查询:

select price, date_from, date_to from mytable where date_format(now(), '%m%d') between date_from and date_to;
+-------+-----------+---------+
| price | date_from | date_to |
+-------+-----------+---------+
|   100 | 0202      | 0531    |
+-------+-----------+---------+
1 row in set (0,01 sec)

修改

阅读你关于@ FelipeDuarte答案的评论......从10月1日(10月1日)到2月1日(2月1日)期间,我们需要考虑新的一年......

您可以通过将期限分为两个来作弊:10/01至12/31和01/01至02/01