如何将周数转换为日期?

时间:2011-08-16 13:12:07

标签: mysql sql datetime

鉴于一年和一个日历周,我怎样才能将该周的星期二作为约会?

10 个答案:

答案 0 :(得分:55)

在MySQL中,STR_TO_DATE()函数只需一行即可完成!


示例:我们希望获得一年中Tuesday th 32的日期2013

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

会输出:

'2013-08-13'

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

答案 1 :(得分:19)

假设您有yearcw(日历周)作为变量(例如来自SELECT语句),您可以按以下方式获取DATE:

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)重复;不想存储变量。 SQL-Statement在MySQL上很适合我。

更新:只是为了澄清:WEEKDAY(DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK))将产生一周的第一天。从中提取一个数字(周二为-1;周三为-2,依此类推,将为您选择一周中的特定日期)。 请参阅here

答案 2 :(得分:9)

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

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

DATE_ADD(MAKEDATE(年,1),INTERVAL cw WEEK)从一年中的第一年起添加不正确的周......

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

根据这个定义,只有1-53的日历周范围才有意义,并且这代表该周的星期日。因此,我们会在今年的第n个星期日增加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
);

答案 3 :(得分:2)

在查看indago's answer然后进行一系列测试时,我得到跟随周作为结果。

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

SELECT STR_TO_DATE('2019 1 Monday', '%x %v %W') -- beginning of week

SELECT STR_TO_DATE('2019 1 Sunday', '%x %v %W') -- end of week

您可以将结果与here进行比较。

答案 4 :(得分:1)

DELIMITER $$
CREATE FUNCTION fn_yearweek_to_date(
    var_yearweek INTEGER UNSIGNED,
    var_weekday ENUM(
        'Monday',
        'Tuesday',
        'Wednesday',
        'Thursday',
        'Friday',
        'Saturday',
        'Sunday'
        )
    )
RETURNS DATE DETERMINISTIC
BEGIN
    RETURN STR_TO_DATE(CONCAT(var_yearweek, var_weekday), '%x%v%W');
END;
DELIMITER ;

SELECT
    fn_yearweek_to_date(YEARWEEK(NOW(), 1), 'Sunday'),
    fn_yearweek_to_date(YEARWEEK(NOW(), 1), 7)
;

答案 5 :(得分:0)

理论上你可以使用带有dw参数的DATEPART来查找当月的第一个周二,然后添加7 * [CalenderWeek]以获得适当的日期

http://msdn.microsoft.com/en-us/library/ms174420.aspx

答案 6 :(得分: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

今天(星期二)。

答案 7 :(得分:0)

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

如果您使用php脚本,您可以将所有日期设置为类似于“day-month-year”的格式,并使用循环每天(从20世纪80年代到2038年或从您的mysql日期列开始)。< / p>

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

然后在该循​​环中的日期使用日期格式将它们转换为一周中的几天。

以下列出了可以在日期格式中使用的内容。 http://www.php.net/manual/en/function.date.php d ñ 升 w ^ 所有这些都可以帮助你解决一周的问题。

答案 8 :(得分:0)

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

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))+@week 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 |
+------------+------------+------------+

答案 9 :(得分:-1)

这个受欢迎的解决方案在2014年和2015年对我有用,但在2016年对我不起作用(可能是因为年初是星期一而不是星期日。

我使用以下函数来纠正这个问题:

STR_TO_DATE( CONCAT(mod(day_nr + 1,7),'/',week_nr,'/',年),'%w /%u /%Y')

在我的数据中: day_nr = 0 - &gt;星期一,

day_nr = 6 - &gt;周日

所以我不得不用mod函数修复它