鉴于一年和一个日历周,我怎样才能将该周的星期二作为约会?
答案 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)
假设您有year
和cw
(日历周)作为变量(例如来自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]以获得适当的日期
答案 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函数修复它