我正在尝试根据当周的当前日期在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?有什么建议?
答案 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已经将这个映射为持久性模型和域模型。