2010-07-23 14 views
31

Jak uzyskać pierwszy dzień danego tygodnia, którego numer tygodnia jest dostępny?Pierwsze dni tygodnia w MySql w tygodniu nr

Na przykład, gdy piszę ten post jesteśmy w TYGODNIA 29 .I chciałby napisać zapytanie MySQL że powróci Niedziela 18 lipca pomocą tego WEEKNO 29 jako jedynego dostępnego parametru.

Odpowiedz

41

Można użyć:

SELECT STR_TO_DATE('201003 Monday', '%X%V %W'); 

To daje poniedziałek datę tydzień 3 z 2010 roku, która byłaby 2010-01-18.

Inny przykład:

SELECT STR_TO_DATE('201052 Sunday', '%X%V %W'); 

nie daje datę niedzielę w 52 tygodniu 2010 roku, co byłoby 2010-12-26.

I wreszcie, przy użyciu oryginalnego przykład:

SELECT STR_TO_DATE('201029 Sunday', '%X%V %W'); 

Daje 2010-07-18.

+0

Po prostu działało idealnie. Dziękujemy – davykiash

+3

Podczas korzystania z trybu tygodniowego 3 (standard ISO, qv http://stackoverflow.com/questions/11788885/), a następnie WYBIERZ STR_TO_DATE ("201003 poniedziałek", "% X% V% W") otrzymasz w poniedziałek tydzień! – ChrisV

+1

Myślę, że to nie jest poprawne. Spróbuj uruchomić SELECT STR_TO_DATE ('201402 Sunday', '% X% V% W'), STR_TO_DATE ('201402 Monday', '% X% V% W') - zobaczysz, że nie jest to niedziela drugiego tygodnia i poniedziałek 2-go tygodnia - jest druga niedziela i drugi poniedziałek roku – 1nstinct

0

Nietestowane (nie mam pod ręką MySQL):

date_add(
    date_sub(curdate(), interval weekday(curdate()) day), 
    interval ((NUM-weekofyear(curdate()))*7) day) 
47

Jest to dokładny sposób na uzyskanie pierwszego dnia tygodnia i ostatni dzień tygodnia na podstawie bieżącej daty:

adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart, 
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd 
+9

Myślę, że to rozwiązanie może być zależne od ustawień regionalnych, używam tego zamiast 'adddate (curdate(), INTERVAL -WEEKDAY (curdate()) DAY) WeekStart' –

+1

@SnowBlind, dziękuję za komentarz. ... a jeśli ktoś szuka piątku jako ostatniego dnia tygodnia (tj. Ostatniego dnia roboczego), spróbuj tego: adddate(curdate(), INTERVAL 4-WEEKDAY(curdate()) DAY) SHOULD_BE_Friday Peter

4

odpowiedź najbardziej lubiany do tej pory ta płyta wygląda tak w swojej podstawowej formie:

SELECT STR_TO_DATE('201003 Monday', '%X%V %W'); 

to jest dobra odpowiedź na początek, ale rozkłada się na kilka dni po uruchomieniu, aby umieścić go używać w połączeniu z funkcją tygodni(), chyba że dodasz jakąś dodatkową logikę .

Oto długo, niechlujny wersja tego samego, ale które wydaje się działać na wszystkich dni (BTW bieżąca data jest wbudowanych w tym asnwer):

SELECT STR_TO_DATE(
(IF(CAST(WEEK(NOW(),0) AS UNSIGNED) = 0, 
(CONCAT(
CAST((CAST(YEAR(NOW()) AS UNSIGNED) - 1) AS CHAR), 
'52 Sunday')), 
(CONCAT(
CAST(YEAR(NOW()) AS CHAR), 
IF(CAST(WEEK(NOW(),0) AS UNSIGNED) < 10,'0',''), 
CAST(WEEK(NOW(),0) AS CHAR), 
' Sunday')))), 
'%X%V %W'); 

ten bałagan dotyka problemów, które powstają kiedy rok przewraca się w pewne dni tygodnia. Na przykład rok 2011 rozpoczął się w sobotę, więc niedziela, która rozpoczęła się w tym tygodniu, miała miejsce w zeszłym roku. Oto wybierz z twardymi kodowanych przykładów:

SELECT STR_TO_DATE(
(IF(CAST(WEEK('2011-01-01',0) AS UNSIGNED) = 0, 
(CONCAT(
CAST((CAST(YEAR('2011-01-01') AS UNSIGNED) - 1) AS CHAR), 
'52 Sunday')), 
(CONCAT(
CAST(YEAR('2011-01-01') AS CHAR), 
IF(CAST(WEEK('2011-01-01',0) AS UNSIGNED) < 10,'0',''), 
CAST(WEEK('2011-01-01',0) AS CHAR), 
' Sunday')))), 
'%X%V %W'); 

YEILDS >> '2010-12-26'

SELECT STR_TO_DATE(
(IF(CAST(WEEK('2011-01-02',0) AS UNSIGNED) = 0, 
(CONCAT(
CAST((CAST(YEAR('2011-01-02') AS UNSIGNED) - 1) AS CHAR), 
'52 Sunday')), 
(CONCAT(
CAST(YEAR('2011-01-02') AS CHAR), 
IF(CAST(WEEK('2011-01-02',0) AS UNSIGNED) < 10,'0',''), 
CAST(WEEK('2011-01-02',0) AS CHAR), 
' Sunday')))), 
'%X%V %W'); 

YEILDS >> '2011-01-02'

Wszystko, co powiedział, Lubię drugi asnwer pisał, że wygląda to

SELECT 
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart, 
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd; 

metoda ta wydaje się działać równie dobrze na wszystkich dat, bez bałaganu!

+1

Nie możesz zrobić tego znacznie prościej, używając trybu 2? YEARWEEK ('2011-01-01', 2) informuje o 52. tygodniu 2010 roku, w przeciwieństwie do trybu 0, który zwraca 0 tydzień 2011 roku. – user1618143

2

Jeśli tydzień-start jest niedziela i week-end jest sobota, użyj tego:

SELECT 
    DATE_ADD(CURDATE(), INTERVAL (MOD(DAYOFWEEK(CURDATE())-1, 7)*-1) DAY) AS week_start, 
    DATE_ADD(CURDATE(), INTERVAL ((MOD(DAYOFWEEK(CURDATE())-1, 7)*-1)+6) DAY) AS week_end 

Testowane na MySQL.

0
SELECT CONCAT(RIGHT(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),2),'-', 
     MID(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),6,2),'-', 
     LEFT(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),4)) AS 'Lundi', 

    CONCAT(RIGHT(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),2),'-', 
     MID(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),6,2),'-', 
     LEFT(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),4)) AS 'Dimanche'; 
0

Dodatek do odpowiedzi DCP za:

SELECT STR_TO_DATE('201553 Monday', '%x%v %W') 

daje poniedziałek, gdy początek tygodnia jest poniedziałek. Specyfikatory formatu muszą być napisane na małą skalę. Nie potrzeba matematyki.

3

To może być najprostszy i dynamiczny sposób na to. Użyj następującego kodu.

SELECT STR_TO_DATE(concat(concat(date_format(CURDATE() , '%Y') , WEEKOFYEAR(CURDATE())) , ' Monday') , '%X%V %W'); 
Powiązane problemy