是否可以在MySQL的where子句中使用当前的dayname?

时间:2015-03-04 06:57:19

标签: mysql where

我正在尝试根据当周的当前日期在MySQL中创建一个视图。我正在创建一个表来跟踪基于星期几的任务。例如,某些任务将在每周二发生,一些将在周三和周五发生,等等。

我决定为每周的每一天都设置一个列。如果当天需要执行任务,我会在列中存储1,否则它将为0.表格如下:

| ID | Monday | Tuesday | Wednesday | Thursday | Friday |    Task     |
-----------------------------------
| 1  |   0    |    1    |     0     |     0    |   0    | "SomeTask"  |
| 2  |   0    |    0    |     1     |     0    |   1    | "SomeTask"  |
| 3  |   0    |    1    |     0     |     0    |   0    | "SomeTask"  |

我想创建一个SELECT语句,该语句将在视图中用于显示当天需要执行的任务。换句话说,今天是星期二,所以我想查询将获得ID为1和3的行显示。

我尝试了以下操作,但它没有工作:

SELECT * FROM MyTasks WHERE DAYNAME(curdate()) = 1

有没有更好的方法来格式化表格?无论如何在WHERE子句中使用DAYNAME?有什么建议?

6 个答案:

答案 0 :(得分:6)

您可以像这样使用case

SELECT * FROM `MyTasks` WHERE (CASE DAYNAME(NOW())
            WHEN 'Monday'    THEN `Monday`=1
            WHEN 'Tuesday'   THEN `Tuesday`=1
            WHEN 'Wednesday' THEN `Wednesday`=1
            WHEN 'Thursday'  THEN `Thursday`=1
            WHEN 'Friday'    THEN `Friday`=1
            END)

除此之外,我没有看到你实现这一目标的任何方式,因为列名是静态的,不能基于其他功能等动态构建

答案 1 :(得分:1)

您可以使用 DAYNAME(curdate())功能获取日期名称 这是星期四(今天是2015-03-05)

根据你的表结构必须使用以下1个查询

01 SELECT * FROM MyTasks WHERE(

CASE DAYNAME(curdate())

        WHEN 'Monday'    THEN `Monday`=1
        WHEN 'Tuesday'   THEN `Tuesday`=1
        WHEN 'Wednesday' THEN `Wednesday`=1
        WHEN 'Thursday'  THEN `Thursday`=1
        WHEN 'Friday'    THEN `Friday`=1
        END)

02 SELECT * FROM MyTasks WHERE(

CASE工作日(curdate())

        WHEN 0    THEN `Monday`=1
        WHEN 1    THEN `Tuesday`=1
        WHEN 2    THEN `Wednesday`=1
        WHEN 3    THEN `Thursday`=1
        WHEN 4    THEN `Friday`=1
        END)

答案 2 :(得分:0)

最好定义名为Day的列,该列将是一周中每天的enum,而不是您拥有的7列,如下所示:

`Day ENUM(1, 2, 3, 4, 5, 6, 7)`

然后,您可以将当前日转换为适当的值(例如从1到7)并在SQL查询中使用它,就像使用PHP一样:

$sql = 'select * from table where Day = ' . date('N');

date('N')将返回1到7之间的值,具体取决于当周的当天。

注意:这将使用运行PHP的机器的服务器时间。

以下是该表的示例:

CREATE TABLE IF NOT EXISTS `enumtest` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Day` enum('1','2','3','4','5','6','7') NOT NULL,
  `Task` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

答案 3 :(得分:0)

DAYNAME会在一周内返回您的日期名称,因此您的查询应为:

SELECT * FROM MyTasks WHERE DAYNAME(NOW()) = 'Saturday';

我认为您需要DAYOFWEEK函数来获取工作日索引。

答案 4 :(得分:0)

使用WEEKDAY()功能获得您要找的答案。

SELECT * FROM MyTasks WHERE WEEKDAY(curdate()) = 1

答案 5 :(得分:0)

您可以保持模型不变,并使用以下两种解决方案之一:使用您的语言插入列名称,就像使用列值(hacky)一样,或者您可以使用存储过程。

但是你也可以用RDBMS通常的方式做这个,有两个表和一个联合表。您将在模式中拥有工作日,任务和weekday_task表。

表任务只有与任务本身相关的数据,可能带有代理序列号。表工作日只有与工作日本身相关的数据,没什么,只是信息作为其名称,可能是work_day属性。

联合将只包括任务Pk和工作日Pk。这是一个普通的n:m关系,记录只存在于约会中。

这个模型可能缺少很多与常见领域问题相关的东西,似乎是一个学习练习,因此,如果是学习,你应该使用n:m解决方案。

对于任务和工作日任务,实际问题可能会增加到需要(有效时间,开始和结束),因为工作日可能会获得特定的一天同伴,作为处理现实世界频率的更复杂的解决方案。这不是一件容易的事情,可能是GoF已经将这个映射为持久性模型和域模型。