给定一年和一个日历周,我怎样才能得到那一周的星期二作为日期?如何将星期数转换为日期?
回答
鉴于你有year
和cw
(砑光周)为变量(例如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。
有不同的标准,“SQL?周数!美国系统(Jan1 = week1周)可能与ISO系统不同(每年的第一个星期四=第1周)。因此,请确保根据您预定的一周内定义进行测试。 – Eljakim
@Eljakim,这是正确的,实际上是为什么“一周一次”的算术能力在某种程度上得不到MySQL的支持。最好不要使用它们。事实上,从“每周的一周”迁移是我为什么写这个查询一次的原因。 – nre
不要为此使用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日' –
那么理论上你可以使用DATEPART与DW参数去找出这个月的第一个星期二,然后添加7 * [CalenderWeek]来获得相应的日期
这里是一个样本,这可能有助于:
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
今天(星期二)是。
我认为使用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 所有帮助你与星期几。
日历周的定义我发现所有的说“从周日开始连续七天的时期”。
以下是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
);
在MySQL中,STR_TO_DATE()函数只需一行即可完成! 例子中,我们想要得到的32 周二的日日的一年周2013年
SELECT STR_TO_DATE('201332 Tuesday', '%X%V %W');
将输出:
'2013-08-13'
我认为这是最好的和最短的解决方案你的问题。
这真是太棒了@indago - 正是我正在寻找。比其他解决方案更优雅。 – Voodoo
非常优雅!当为STR_TO_DATE()构造YYYYCW字符串时,你可以使用这个'... STR_TO_DATE(CONCAT(YEAR(field),LPAD(WEEKOFYEAR(field,2,'0'))..' –
@AlBundy你可以使用它从当前日期或特定字段中提取,如上所示,只需用'date_field'替换'CURDATE()'就像这样 'SELECT STR_TO_DATE(CONCAT(YEAR(CURDATE()),LPAD(WEEKOFYEAR CURDATE()),2,'0'),'',DAYNAME(CURDATE())),'%X%V%W');' – indago
鉴于解决方案没有考虑,一年的第一周可能会在十二月底开始。因此,我们必须检查,如果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 |
+------------+------------+------------+
在看着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
的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功能
- 1. UNIX日期:如何将星期数转换为日期范围(星期一至星期日)?
- 2. 将日期转换为星期几
- 3. 将星期数转换为星期六的日期范围作为beginning_of_week
- 4. 如何将结果日期输出转换为星期几
- 5. 如何将日期转换为星期编号
- 6. 将日期数转换为日期
- 7. 如何将长期转换为日期?
- 8. 如何将数字转换为日期
- 9. 如何将日期转换为整数?
- 10. 如何将整数转换为日期?
- 11. 如何将小数转换为日期?
- 12. 如何将日期转换为周数
- 13. 将日,星期和年份转换为日期
- 14. 如何将日期日期转换为英文日期格式?
- 15. SQL将天数转换为星期数
- 16. 从GPS星期数,星期几到日期时间转换
- 17. 如何将数字日期变量转换为季度日期?
- 18. 如何将R日期转换为Excel数字序列日期?
- 19. 如何在SQL Server中将日期转换为ISO-8601星期数字格式?
- 20. 如何将星期一的星期一转换为整数1,星期二转换为星期二的星期二?
- 21. Python:将星期一'星期二'转换为'星期一到星期三'
- 22. 如何将日期时间转换为R中的第一个星期日
- 23. 如何将日期(02/07/2012)转换为2012年2月7日星期二
- 24. 将星期数转换为从SSRS/SQL Server开始的星期
- 25. 将日期转换为MongoDB ISO日期
- 26. 将日期转换为日期串行
- 27. 将MySQL日期转换为Java日期
- 28. 将linq日期转换为短日期
- 29. 将UTC日期秒转换为日期
- 30. PHP - 将日期转换为UTC日期
请注意什么味道 –