是否可以在 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)
我正在尝试根据星期几在 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)