2011-08-16 29 views

回答

17

鉴于你有yearcw(砑光周)为变量(例如SELECT语句),您可以获取日期如下:

DATE_SUB(
    DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK), 
    INTERVAL WEEKDAY(
    DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK) 
) -1 DAY), 

短语DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK)是duplica泰德;不想存储变量。 SQL语句在MySQL上对我很好。

更新:只是为了澄清:WEEKDAY(DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK))将产生一周的第一天。从中减去一个数字(星期二为-1;星期三为-2等)将为您选择一周中的特定日期。 见here

+0

有不同的标准,“SQL?周数!美国系统(Jan1 = week1周)可能与ISO系统不同(每年的第一个星期四=第1周)。因此,请确保根据您预定的一周内定义进行测试。 – Eljakim

+0

@Eljakim,这是正确的,实际上是为什么“一周一次”的算术能力在某种程度上得不到MySQL的支持。最好不要使用它们。事实上,从“每周的一周”迁移是我为什么写这个查询一次的原因。 – nre

+0

不要为此使用MAKEDATE,它会构造错误的日期,尤其是当您使用商业日期和日历周数时。例如'MAKEDATE(2017,1)'会给你'Sun,2017年1月1日',*这实际上是2016年的第52周*,2017年的第一周从1月2日开始。相反,使用'STR_TO_DATE('2017 1 Monday','%x%v%W')'来得到正确星期的'Monday'产生'Mon,2017年1月2日' –

0

这里是一个样本,这可能有助于:

SET DATEFIRST 1 
declare @wk int set @wk = 33 
declare @yr int set @yr = 2011 

select dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 2 - 
    datepart(dw, dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 4) as date 

,其结果是:

2011-08-16 00:00:00.000 

今天(星期二)是。

0

我认为使用php编写函数的逻辑会更容易。

如果您使用的是PHP脚本,您可以将所有日期的格式设置为“日 - 月 - 年”,并使用循环遍历每日(从20世纪80年代到2038年或从您的mysql日期列中)。

http://www.php.net/manual/en/function.date-format.php

然后使用日期格式的日期,在该循环将它们转换为星期几。

以下是可以在日期格式中使用的东西的列表。 http://www.php.net/manual/en/function.date.php D N l w 所有帮助你与星期几。

9

日历周的定义我发现所有的说“从周日开始连续七天的时期”。

以下是MySQL的具体...您的里程可能会有所不同...

DATE_ADD(MAKEDATE(年,1),间隔CW WEEK)从是不正确的一年中增加了1周。 ...

mysql> select DATE_ADD(MAKEDATE(2011, 1), INTERVAL 1 WEEK); 
+----------------------------------------------+ 
| DATE_ADD(MAKEDATE(2011, 1), INTERVAL 1 WEEK) | 
+----------------------------------------------+ 
| 2011-01-08         | 
+----------------------------------------------+ 

通过这个定义,它只是有意义的让日历周范围从1-53,并且这代表该周的星期日。因此,我们将在今年的第十个周日增加2天以获得周二。

下面得到一年中第一个星期日的日期......

mysql> select date_add('2012-01-01', interval (8 - dayofweek('2011-01-01')) % 7 DAY); 
+------------------------------------------------------------------------+ 
| date_add('2012-01-01', interval (8 - dayofweek('2011-01-01')) % 7 DAY) | 
+------------------------------------------------------------------------+ 
| 2012-01-02                | 
+------------------------------------------------------------------------+ 

所以这将让10日星期日(9一周以来,我们已经在1音符间隔)的日期......

mysql> select date_add(date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week); 
+-----------------------------------------------------------------------------------------------------+ 
| date_add(date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week) | 
+-----------------------------------------------------------------------------------------------------+ 
| 2010-03-07                       | 
+-----------------------------------------------------------------------------------------------------+ 

加2天以上才能到周二...

mysql> select date_add(date_add(date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week), interval 2 day); 
+--------------------------------------------------------------------------------------------------------------------------------+ 
| date_add(date_add(date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week), interval 2 day) | 
+--------------------------------------------------------------------------------------------------------------------------------+ 
| 2010-03-09                              | 
+--------------------------------------------------------------------------------------------------------------------------------+ 

或者更一般地:

select 
date_add( 
    date_add( 
     date_add('<year>-01-01', interval (8 - dayofweek('<year>-01-01')) % 7 DAY) 
     , interval <week-1> week) 
    , interval <dayOfWeek> day 
); 
50

在MySQL中,STR_TO_DATE()函数只需一行即可完成! 例子中,我们想要得到的32 周二的日日的一年周2013年

SELECT STR_TO_DATE('201332 Tuesday', '%X%V %W'); 

将输出:

'2013-08-13' 

我认为这是最好的和最短的解决方案你的问题。

+2

这真是太棒了@indago - 正是我正在寻找。比其他解决方案更优雅。 – Voodoo

+1

非常优雅!当为STR_TO_DATE()构造YYYYCW字符串时,你可以使用这个'... STR_TO_DATE(CONCAT(YEAR(field),LPAD(WEEKOFYEAR(field,2,'0'))..' –

+0

@AlBundy你可以使用它从当前日期或特定字段中提取,如上所示,只需用'date_field'替换'CURDATE()'就像这样 'SELECT STR_TO_DATE(CONCAT(YEAR(CURDATE()),LPAD(WEEKOFYEAR CURDATE()),2,'0'),'',DAYNAME(CURDATE())),'%X%V%W');' – indago

0

鉴于解决方案没有考虑,一年的第一周可能会在十二月底开始。因此,我们必须检查,如果1月1日属于calendarweek旧的或新的一年里:

SET @week=1; 
SET @year=2014; 
SET @x_weeks_after_new_year=DATE_ADD(MAKEDATE(@year, 1), INTERVAL (SELECT IF(WEEKOFYEAR(MAKEDATE(@year, 1))>50 , 0 , -1))[email protected] WEEK); 
SELECT 
    CONCAT(@year, '-', @week) WeekOfYear, 
    @weekStart:=DATE_SUB(@x_weeks_after_new_year, INTERVAL WEEKDAY(@x_weeks_after_new_year) DAY) Monday, 
    DATE_ADD(@weekStart, INTERVAL 6 DAY) Sunday 

这将导致:

+------------+------------+------------+ 
| WeekOfYear | Monday | Sunday | 
+------------+------------+------------+ 
| 2014-1 | 2013-12-30 | 2014-01-05 | 
+------------+------------+------------+ 
0

在看着indago答案,然后做一些测试,我作为结果正在接下来的一周。

我做了一个小调整,然后匹配日期。

STR_TO_DATE( '#{year_week}星期一', '%X%V%W') - 本周初

STR_TO_DATE( '#{year_week}星期天', '%X%V%W') - 周结束

您可以比较的结果在这里http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php?year=2015

-1

的upvoted解决方案在2014年和2015年为我工作,但对我来说,2016年没有工作(可能是因为新年的开始是在周一和不是在星期天

我用下面的函数来解决这个问题:

STR_TO_DATE( CONCAT(MOD(day_nr + 1,7), '/',week_nr, '/',年), '%W /%U /%Y')

在我的数据: day_nr = 0 - >周一,

day_nr = 6 - >周日

所以我不得不修复与MOD功能

相关问题