MySQL День разницы в отметках времени неверно - PullRequest
0 голосов
/ 18 июня 2020

Я сделал такой запрос. За исключением дня, все они рассчитывают правильно. Как это исправить?

SELECT IF(TIMESTAMPDIFF(YEAR, '2017-10-13 16:57:27', NOW()) > 0, 
          CONCAT(
              TIMESTAMPDIFF(YEAR, '2011-01-19 16:57:27', NOW()), ' yıl ',
              MOD(TIMESTAMPDIFF(MONTH, '2011-01-19 16:57:27', NOW()), 12), ' ay ',
              FLOOR(MOD(TIMESTAMPDIFF(DAY, '2011-01-19 16:57:27', NOW()), 30.4375)), ' gün ',
              MOD(TIMESTAMPDIFF(HOUR, '2011-01-19 16:57:27', NOW()), 24), ' saat ',
              MOD(TIMESTAMPDIFF(MINUTE, '2011-01-19 16:57:27', NOW()), 60), ' dakika ',
              MOD(TIMESTAMPDIFF(SECOND, '2011-01-19 16:57:27', NOW()), 60), ' saniye'
            ),

        IF(MOD(TIMESTAMPDIFF(MONTH, '2011-01-19 16:57:27', NOW()), 12) > 0, 
            CONCAT(
                MOD(TIMESTAMPDIFF(MONTH, '2011-01-19 16:57:27', NOW()), 12), ' ay ',
                FLOOR(MOD(TIMESTAMPDIFF(DAY, '2011-01-19 16:57:27', NOW()), 30.4375)), ' gün ',
                MOD(TIMESTAMPDIFF(HOUR, '2011-01-19 16:57:27', NOW()), 24), ' saat ',
                MOD(TIMESTAMPDIFF(MINUTE, '2011-01-19 16:57:27', NOW()), 60), ' dakika ',
                MOD(TIMESTAMPDIFF(SECOND, '2011-01-19 16:57:27', NOW()), 60), ' saniye'
            ),

        IF(FLOOR(MOD(TIMESTAMPDIFF(DAY, '2011-01-19 16:57:27', NOW()), 30.4375)) > 0, 
            CONCAT(
                FLOOR(MOD(TIMESTAMPDIFF(DAY, '2011-01-19 16:57:27', NOW()), 30.4375)), ' gün ',
                MOD(TIMESTAMPDIFF(HOUR, '2011-01-19 16:57:27', NOW()), 24), ' saat ',
                MOD(TIMESTAMPDIFF(MINUTE, '2011-01-19 16:57:27', NOW()), 60), ' dakika ',
                MOD(TIMESTAMPDIFF(SECOND, '2011-01-19 16:57:27', NOW()), 60), ' saniye'
            ),

        IF(MOD(TIMESTAMPDIFF(HOUR, '2011-01-19 16:57:27', NOW()), 24) > 0, 
            CONCAT(
                MOD(TIMESTAMPDIFF(HOUR, '2011-01-19 16:57:27', NOW()), 24), ' saat ',
                MOD(TIMESTAMPDIFF(MINUTE, '2011-01-19 16:57:27', NOW()), 60), ' dakika ',
                MOD(TIMESTAMPDIFF(SECOND, '2011-01-19 16:57:27', NOW()), 60), ' saniye'
            ),

        IF(MOD(TIMESTAMPDIFF(MINUTE, '2011-01-19 16:57:27', NOW()), 60) > 0, 
            CONCAT(
                MOD(TIMESTAMPDIFF(MINUTE, '2011-01-19 16:57:27', NOW()), 60), ' dakika ',
                MOD(TIMESTAMPDIFF(SECOND, '2011-01-19 16:57:27', NOW()), 60), ' saniye'
            ),

        IF(MOD(TIMESTAMPDIFF(SECOND, '2011-01-19 16:57:27', NOW()), 60) > 0, 
            CONCAT(
                MOD(TIMESTAMPDIFF(SECOND, '2011-01-19 16:57:27', NOW()), 60), ' saniye'
            ),

        'Yok'))))))
AS time

Результат: 9 yıl 4 ay 28 gün 18 saat 6 dakika 13 saniye

Ожидается: 9 yıl 4 ay 29 gün 18 saat 6 dakika 13 saniye

1 Ответ

1 голос
/ 18 июня 2020
SET @start = '2011-01-19 16:57:27';
SET @finish = CURRENT_TIMESTAMP;
SELECT TIMESTAMPDIFF(YEAR,   @start,                                                          @finish) diff_years,
       TIMESTAMPDIFF(MONTH,  @start + INTERVAL TIMESTAMPDIFF(YEAR,   @start, @finish) YEAR,   @finish) diff_months,
       TIMESTAMPDIFF(DAY,    @start + INTERVAL TIMESTAMPDIFF(MONTH,  @start, @finish) MONTH,  @finish) diff_days,
       TIMESTAMPDIFF(HOUR,   @start + INTERVAL TIMESTAMPDIFF(DAY,    @start, @finish) DAY,    @finish) diff_hours,
       TIMESTAMPDIFF(MINUTE, @start + INTERVAL TIMESTAMPDIFF(HOUR,   @start, @finish) HOUR,   @finish) diff_minutes,
       TIMESTAMPDIFF(SECOND, @start + INTERVAL TIMESTAMPDIFF(MINUTE, @start, @finish) MINUTE, @finish) diff_seconds
;
...