SQL查询仅显示给定周数中的日期

时间:2015-03-18 08:47:17

标签: php sql

我对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`)
) 

4 个答案:

答案 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