是否可以在 MySQL 的 where 子句中使用当前的日期名称?

Is it possible to use the current dayname in the where clause in MySQL?

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

我决定 table 为一周中的每一天设置一列。如果任务需要在那天执行,我会在列中存储一个 1,否则它将是一个 0。 table 看起来像这样:

| 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

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

最好定义一个名为 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') 将 return 一个从 1 到 7 的值,具体取决于星期几。

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

这是 table 的示例:

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 ;

DAYNAME returns 你是星期几,所以你的查询应该是:

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

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

使用 WEEKDAY() 函数获取您正在寻找的答案。

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

您可以这样使用 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)

除此之外,我看不到您有任何方法可以做到这一点,因为列名是静态的,不能基于其他函数等动态构建

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

但是您也可以使用 RDBMS 通常的方式来执行此操作,使用两个 table 和一个联合的。您的模式中会有一个工作日、一个任务和一个 weekday_task table。

Table 任务只会包含与任务本身相关的数据,可能带有代理序列号。 Table weekday 仅与工作日本身相关的数据,没什么,只是其名称和可能 working_day 属性的信息。

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

这个模型可能遗漏了很多与常见领域问题相关的东西,看起来像是一个学习练习,所以,如果它是关于学习的,你应该选择 n:m 解决方案。

对于任务和 weekday_task,实际问题可能会增长到需要(有效时间,开始和结束),因为工作日可能会获得一个特定的日期伴侣,作为一个更复杂的解决方案来处理无论如何都具有真实世界的频率。这不是微不足道的事情,GoF 可能已经将其映射为持久性模型和域模型。

您可以使用 DAYNAME(curdate()) 函数获取日期名称 这将在星期四返回(今天是 2015 年 3 月 5 日)但是

根据您的 table 结构必须使用以下查询之一

01 SELECT * 从 MyTasks 哪里 (

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 * 从 MyTasks 哪里 (

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)