2013-02-01 69 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等)