如果我有一个存储一周中不同日期价格的表格,我将如何根据当天使用适当的列?
表结构:
room_id | mon | tue | wed | thu | fri | sat | sun
1 | 50.00 | 40.00 | 50.00 | 55.00 | 60.00 | 60.00 | 40.00
如果我需要今天(2013 年 2 月 1 日 - 星期五)的价格room_id#1
,那么实现这一目标的最佳方法是什么?
首先,您在 PHP 中度过了美好的一天。今天或在表单中选择的日期。
$date = date(); // this grabs today, but you can enter any date you want
$day = date('D', $date); // this gets Mon / Tue / ...
$day = strtolower($day);
$query = "SELECT `{$day}` as price FROM `table` WHERE room_id = 1";
这应该只选择正确的价格。
这是新的(ish)DateTime类的类似代码
$date = new DateTime();
$day = strtolower($date->format('D'));
参考:
这里是纯sql版本。
SELECT room_ID,
CASE DAYOFWEEK(CURDATE())
WHEN 1 THEN sun
WHEN 2 THEN mon
WHEN 3 THEN tue
WHEN 4 THEN wed
WHEN 5 THEN thu
WHEN 6 THEN fri
WHEN 7 THEN sat
END price
FROM tableName
// WHERE ....
另一个是使用PreparedStatement
它可以包装在存储过程中,
SET @dayName = DATE_FORMAT(CURDATE(),'%a');
SET @sql = CONCAT('SELECT room_ID, `', @dayName, '` FROM tableName');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
从长远来看,您可以通过重组数据来避免悲伤 - 有一个 Day 列(可以是 enum('Mon','Tue','Wed','Thu','Fri','Sat','Sun ') 以便于使用和阅读),其中包含您的价格适用于一周中的哪一天,并且查询变为(例如星期五):
select price where room_id = 1 and day = 'Fri';
这使您的第一个查询变得容易,但是由于您稍后可能会进行报告和其他工作,因此它也将使所有后续查询变得容易。
对于快捷方式,如果您使 enum('Sun','Mon','Tue','Wed','Thu','Fri','Sat') 符合 ODBC 标准,则可以使用:
select price where room_id = 1 and day = dayofweek(now());
(因为枚举的第一个值是 1,第二个是 2,等等)
$weekDays = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
$day = $weekDays[date('w')];
mysql_query("SELECT ".$day." FROM table WHERE room_id = 1");
你可能会做类似的事情
$day = date('D',time());
$day = strtolower($day);
然后 SELECT {$day} FROM table WHERE room_id = '1'