我对SQL和PHP有疑问。我制作了下表来保存时间表的记录。属性uur_datum
保存日期,如2015-03-18。这个日期是在第12周。
我需要一个只显示给定周内日期的SQL查询。像这样的东西(伪代码):
SELECT dates WHERE week = 12;
我可以添加一个名为week的属性并保存周数,但我确信这是一种更有效的方法。
CREATE TABLE IF NOT EXISTS `sys_uren` (
`uur_id` int(11) NOT NULL AUTO_INCREMENT,
`uur_datum` date NOT NULL,
`start_tijd` time NOT NULL,
`eind_tijd` time NOT NULL,
`uurcode` int(11) NOT NULL,
`akkoord` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`uur_id`),
KEY `uurcode_id` (`uurcode`)
)
答案 0 :(得分:2)
周是有趣的事情。有些地方每周星期天开始;其他人使用周一。确定一年中第一周的日期的规则各不相同。
MySQL有一些处理周的便利功能。你需要选择正确的。你需要仔细使用它,因为你的查询必须在每年的开始和结束时做正确的事。
正确的功能不是week()
,weekofyear()
或datepart()
。正确的功能是yearweek()
。
create table test(test_date date not null);
insert into test values ('2013-12-31'), ('2014-01-10'), ('2015-01-10');
select
test_date,
year(test_date) as yr,
week(test_date, 3) as wk,
yearweek(test_date, 3) as yr_wk
from test
order by test_date;
Mode 3对应于ISO周,这是我使用的。
test_date yr wk yr_wk -- 2013-12-31 2013 1 201401 2014-01-10 2014 2 201402 2015-01-10 2015 2 201502
看第一行。无论你如何计算周数,' 2013-12-31'只是不可以在2013年的第一周,对吗?但可以在2014年的第一周。(根据ISO。)
因此,您需要使用表达式yearweek(your_column, correct_mode_number)
来获取日期的正确周值。您使用的模式取决于应用程序。
select *
from sys_uren
where yearweek(uur_datum, 3) = 201512;
我在这里使用了模式3,但你可能需要一个不同的模式。请参阅我上面链接的文档。
周模式
模式1,3,5和7都表示星期一是一周的第一天。它们的范围和定义在一年中的第一周有所不同。
答案 1 :(得分:1)
您可以使用DATEDIFF()和CEIL()函数计算mySQL中2个不同日期之间的周数,如下所示:
SELECT CEIL( DATEDIFF('2011-05-10','2011-05-2')/7 ) AS Weeks;
附加查询:
SELECT uur_datum from sys_uren WHERE WEEKOFYEAR(uur_datum) = 12
答案 2 :(得分:1)
尝试:
SELECT `uur_datum` FROM `sys_uren` WHERE WEEKOFYEAR(uur_datum) LIKE 11;
这似乎有效!
答案 3 :(得分:0)
使用DATEPART
SELECT *
FROM sys_uren
WHERE DATEPART(week, uur_datum) = 12