MySQL 날짜 차이 계산 문의 0 5 1,090

by 레브레카 [MySQL] 날짜 차이 엑셀 수식 [2022.09.14 12:27:32]


엑셀 수식을 MySQL에 적용하고자 하는데 검색해봐도 모르겠습니다...

 

엑셀 함수는 다음과 같습니다.

DATEDIF(J47,TODAY(),"Y")&"년"

DATEDIF(J47,TODAY(),"YM")&"개월"

DATEDIF(J47,TODAY(),"mD")&"일"

 

기준일에 따른 결과 값

2016-01-01 : 6년 / 8개월 / 13일

2022-08-22 : 0년 / 0개월 / 23일

 

MySQL 처리 시,

2016-01-01 은 이상이 없는데,

2022-08-22 의 경우에는 0년 / 1개월 / -8일 이 튀어 나와버리네요...

 

WITH TEMP AS (

SELECT '홍길동' AS NAME, '2016-01-01' AS ENTRY_DATE FROM DUAL

UNION ALL

SELECT '임꺽정' AS NAME, '2022-08-22' AS ENTRY_DATE FROM DUAL

)

SELECT NAME, ENTRY_DATE

, CONCAT(YEAR(NOW()) - YEAR(ENTRY_DATE), '년') AS YEAR_DIFF

, CONCAT(MONTH(NOW()) - MONTH(ENTRY_DATE), '개월') AS MONTH_DIFF

, CONCAT(DAY(NOW()) - DAY(ENTRY_DATE), '일') AS DAY_DIFF

FROM TEMP

 

엑셀 수식을 MySQL에 어떻게 적용해야 할까요 ㅠㅠ

by pajama [2022.09.14 13:34:32]

mysql은 datediff랑 timestampdiff 함수 기능이 있네요.

단위를 지정하신다면 timestampdiff 를 사용하시면 될듯합니다.


mysql>  select timestampdiff(day, '2022-08-22', now());
+-----------------------------------------+
| timestampdiff(day, '2022-08-22', now()) |
+-----------------------------------------+
|                                      23 |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql>  select timestampdiff(month, '2022-08-22', now());
+-------------------------------------------+
| timestampdiff(month, '2022-08-22', now()) |
+-------------------------------------------+
|                                         0 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql>  select timestampdiff(year, '2022-08-22', now());
+------------------------------------------+
| timestampdiff(year, '2022-08-22', now()) |
+------------------------------------------+
|                                        0 |
+------------------------------------------+
1 row in set (0.00 sec)

by 레브레카 [2022.09.14 14:06:29]

2016-06-01 의 경우,

2448

80

6

이 나옵니다... 


by 레브레카 [2022.09.14 14:08:17]

깔끔하지는 않지만 어떤 분이 해결해 주셨습니다.

 

WITH temp
AS
(
         SELECT '홍길동'  AS name,
                '2016-01-01' AS entry_date
         FROM   DUAL
         UNION ALL
         SELECT '임꺽정'  AS name,
                '2022-08-22' AS entry_date
         FROM   DUAL
         UNION ALL
         SELECT '장발장'  AS name,
                '2018-11-01' AS entry_date
         FROM   DUAL
)
  SELECT name,
         entry_date,
         timestampdiff(year, str_to_date(entry_date, '%Y-%m-%d'), now()) AS year_diff,
         timestampdiff(month, date_add(str_to_date(entry_date, '%Y-%m-%d'), INTERVAL timestampdiff(year, str_to_date(entry_date, '%Y-%m-%d'), now()) year), now()) AS month_diff,
         timestampdiff(day, date_add(date_add(str_to_date(entry_date, '%Y-%m-%d'), INTERVAL timestampdiff(year, str_to_date(entry_date, '%Y-%m-%d'), now()) year), INTERVAL timestampdiff(month, date_add(str_to_date(entry_date, '%Y-%m-%d'), INTERVAL timestampdiff(year, str_to_date(entry_date, '%Y-%m-%d'), now()) year), now()) month), now()) AS day_diff
  FROM   temp;
 

이보다 깔끔한 방법이 있었으면 좋긴하겠지만 일단 엑셀과 결과 값이 일치하긴 합니다.


by pajama [2022.09.14 14:32:25]

문서를 보니 액셀 datedif 함수 기능 옵션이 있었네요.. 해결되셔서 다행입니다.


by 마농 [2022.09.14 15:03:37]

WITH temp AS
(
SELECT '홍길동' name, '2016-01-01' entry_date
UNION ALL SELECT '임꺽정', '2022-08-22'
UNION ALL SELECT '장발장', '2018-11-01'
)
SELECT name
     , entry_date
     , TIMESTAMPDIFF(year , entry_date, NOW()) y
     , TIMESTAMPDIFF(month, entry_date, NOW()) % 12 m
     , TIMESTAMPDIFF(day, TIMESTAMPADD(month, TIMESTAMPDIFF(month, entry_date, NOW()), entry_date), NOW()) d
  FROM temp
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입