【问题标题】:Getting price depending on day of the week根据星期几获取价格
【发布时间】:2013-02-01 15:21:09
【问题描述】:

如果我有一个存储一周中不同日期价格的表格,我将如何根据当天使用适当的列?

表结构:

room_id | mon   | tue   | wed   | thu   | fri   | sat   | sun
1       | 50.00 | 40.00 | 50.00 | 55.00 | 60.00 | 60.00 | 40.00

如果我需要room_id#1 今天(2013 年 2 月 1 日 - 星期五)的价格,最好的方法是什么?

【问题讨论】:

  • SELECT fri FROM table WHERE room_id=1 ?
  • 你能不能用一天列和七行来设置表格?

标签: php mysql sql pdo


【解决方案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'));

参考资料:

【讨论】:

  • +1:我认为它不需要 strtotime($date) 只是 $day = strtolower(date('D'));
【解决方案2】:

这里是纯 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;

【讨论】:

    【解决方案3】:
    $weekDays = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
    $day = $weekDays[date('w')];
    mysql_query("SELECT ".$day." FROM table WHERE room_id = 1");
    

    【讨论】:

      【解决方案4】:

      你可能会做类似的事情

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

      然后 SELECT {$day} FROM table WHERE room_id = '1'

      【讨论】:

        【解决方案5】:

        从长远来看,您可以通过重组数据来避免悲伤 - 有一个 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等)

        【讨论】:

          猜你喜欢
          • 2016-10-22
          • 1970-01-01
          • 2019-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多