給定一年和一個日曆周,我怎樣才能得到那一週的星期二作爲日期?如何將星期數轉換爲日期?
回答
鑑於你有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日期
請注意什麼味道 –