我正在处理我正在处理的应用程序时遇到一些麻烦,我希望得到一些指导。
我有一个简单的预订系统:每个项目都有一个标准价格,但有些时候价格可以改变。
例如:
标准价格 100 /天
从每年的Oct. 1st
到Feb. 1st
,价格 80 /天
从每年的Jun. 1st
到Aug. 31st
,价格 120 /天
[...] 最多6次不同的价格变动(季节)
因为这是一年一次,我只需要月和日,但我不知道如何将这些值存储在数据库中。我想要有两个字段,一个用于月份,一个用于包含数值的一天(01-12
表示月份,01-31
表示日期。这些值由用户自己设置,并且它们与项目本身相关,并不是每个人都固定的。
问题是,当有人预订时,我需要检查价格是否需要更改,我不明白如何构建查询来检查这一点。为了使maters最差,价格在预订期间可以有多个值。
按照上面的示例,如果我要预订从Sep. 1st (current year)
到Jul. 1st (next year)
的商品,价格将如下:
100 /天从Sep. 1st
到Sep. 30th
80 /天从Oct. 1st
到Feb. 1st
Feb. 2nd
to May 31st
的100 /天
120 /天从Jun. 1st
到Jul. 1st
有没有办法检查这些案例而不必每天循环并检查数据库是否匹配?
谢谢
答案 0 :(得分:2)
我不知道你的数据库表,但我认为你可以这样做:
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
您将“复制”数据库信息,例如日,月和日,但这是为了获得更好的性能。
答案 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