programing

No. 주를 사용하여 MySql에서 주의 첫 번째 요일 가져오기

lastmoon 2023. 9. 4. 20:36
반응형

No. 주를 사용하여 MySql에서 주의 첫 번째 요일 가져오기

주 번호를 사용할 수 있는 특정 주의 첫 번째 요일을 얻으려면 어떻게 해야 합니까?

예를 들어 제가 이 게시물을 쓰는 동안 우리는 29주차에 있습니다.7월 18일 일요일에 반환되는 MySQL 쿼리를 이번 WEEKNO 29를 유일한 매개 변수로 사용하여 작성하고자 합니다.

다음은 현재 날짜를 기준으로 주의 첫 번째 날과 마지막 날을 정확하게 가져오는 방법입니다.

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

사용할 수 있는 항목:

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

이렇게 하면 2010년 3주 월요일 날짜가 표시되며, 이 날짜는 2010-01-18일 것입니다.

다른 예:

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

2010년 52주 일요일 날짜, 2010-12-26일 것입니다.

마지막으로, 기존의 예를 사용합니다.

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

이것은 2010-07-18을 제공합니다.

이 게시판에서 지금까지 가장 좋아하는 답은 기본적인 형태로 다음과 같습니다.

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

이는 처음에는 좋은 답변이지만, 추가 논리를 추가하지 않는 한 week() 함수와 함께 사용하기 시작하는 날이 있습니다.

다음은 동일한 내용의 길고 지저분한 버전이지만 모든 날에 작동하는 것처럼 보입니다(BTW 현재 날짜는 이 답변에 포함됨).

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');

이 혼란은 한 해가 특정 요일에 넘어갈 때 발생하는 문제를 처리합니다.예를 들어 2011년은 토요일에 시작했기 때문에 한 주를 시작한 일요일은 전년도입니다.다음은 하드 코딩된 예제가 포함된 선택 항목입니다.

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');

YEILS >> '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');

YEILS >> '2011-01-02'

그렇긴 하지만, 저는 이렇게 보이는 다른 답변이 게시된 것이 좋습니다.

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

이 방법은 엉망이 되지 않고 모든 날짜에 잘 작동하는 것 같습니다!

이것이 가장 간단하고 역동적인 방법이 될 수 있습니다.다음 코드를 사용합니다.

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

주 시작이 일요일이고 주말이 토요일인 경우 다음을 사용합니다.

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

MySQL에서 테스트됨.

dcp의 답변에 추가:

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

한 주의 시작이 월요일인 월요일을 제공합니다.형식 지정자는 작게 작성하면 됩니다.수학은 필요 없습니다.

테스트되지 않음(MySQL이 없습니다):

date_add(
   date_sub(curdate(), interval weekday(curdate()) day),
   interval ((NUM-weekofyear(curdate()))*7) day)
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';

위의 용액으로 테스트됨.저는 이것을 사용하게 되었습니다.

STR_TO_DATE( concat( YEARWEEK("2012-12-31", 3) , ' Monday' ) , '%x%v %W' )

몇 가지 요점:

  • ISO 연도 및 주에 '%x%v %W' 사용
  • ISO 모드의 경우 YEARWEEK('your date', 3)를 두 번째 인수에 3과 함께 사용합니다(월요일부터 시작).

첫 번째 월요일을 찾기 위해 아래 날짜로 테스트:

  • 2012-12-31 --> 2012-12-31
  • 2014-01-07 --> 2014-01-06

언급URL : https://stackoverflow.com/questions/3317980/getting-first-day-of-the-week-in-mysql-using-week-no

반응형