2013-02-01 41 views
2

如果我有一张表格来存储一周中不同日子的价格,我将如何根据当天使用相应的列?取决于星期几的价格

表结构:

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,这将是实现这一目标的最佳方式是什么?

+0

'SELECT钱从表WHERE ROOM_ID = 1'? –

+1

难道你不能将表格设置为日栏和七行吗? – Juddling

回答

5

首先,您将在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')); 

参考文献:

+0

+1:我认为它不需要strtotime($ date)只是$ day = strtolower(date('D')); – 2013-02-01 15:29:40

+0

是的,你是对的。删除了'strtotime()' –

4

这里纯粹的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; 
+2

+1只使用SQL语法 – 2013-02-01 15:27:53

+1

相同。好的解决方案 –

0
$weekDays = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'); 
$day = $weekDays[date('w')]; 
mysql_query("SELECT ".$day." FROM table WHERE room_id = 1"); 
0

你可能会做这样的事情

$day = date('D',time()); 
$day = strtolower($day); 

然后 选择{$天} FROM表WHERE ROOM_ID = '1'

0

你能救自己的悲痛,从长远来看通过重组你的数据 - 有一个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等)