Есть ли эквивалент в sprintf ('% + 03d: 00', $ my_number) в MariaDB? - PullRequest
1 голос
/ 05 марта 2019

Моя цель - преобразовать TimeZone из числового формата в строку (например, от -10 до "-10: 00") в SQL (MySQL или MariaDB).

На самом деле я хочу то же самое, что и (в PHP)):

echo sprintf('%+03d:00', $timezone);
| In  | Out      |
|-----|----------|
| -10 | "-10:00" |
| -2  | "-02:00" |
| 2   | "+02:00" |
| 10  | "+10:00" |

Есть ли способ использовать его в синтаксисе SQL?

Я начал писать:

SELECT CONCAT(CONVERT(timezone), CHAR), ":00");

Но результат не такой, как ожидалось:

| In  | Out      |
|-----|----------|
| -10 | "-10:00" |
| -2  |  "-2:00" |
| 2   |   "2:00" |
| 10  |  "10:00" |

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 05 марта 2019

Вы можете выполнить преобразование MySQL / MariaDB с помощью

  (
     CONCAT(
        CASE
          # sign condition check
          WHEN (ABS(timezone) = timezone) = 0
          THEN "-"
          ELSE "+"
         END
      , LPAD(ABS(timezone), 2, '0')
      , ":00"
     )
   ) AS alias

Запрос с данными испытаний

SELECT
   timezone AS 'In'
 , (
     CONCAT(
        CASE
          # sign condition check
          WHEN (ABS(timezone) = timezone) = 0
          THEN "-"
          ELSE "+"
         END
      , LPAD(ABS(timezone), 2, '0')
      , ":00"
     )
   ) AS 'Out'

FROM (

SELECT -10 as timezone
UNION ALL
SELECT -2 AS timezone
UNION ALL
SELECT 2 AS timezone
UNION ALL
SELECT 10 AS timezone 

) AS test_data;

Результаты

| In  | Out    |
| --- | ------ |
| -10 | -10:00 |
| -2  | -02:00 |
| 2   | +02:00 |
| 10  | +10:00 |

см. демо

0 голосов
/ 15 марта 2019
SELECT  dt + INTERVAL timezone HOUR;

Добавит timezone часов к DATETIME dt.Я предполагаю, что timezone является целым числом со знаком.

...