DATEADD в MariaDB - PullRequest
       4

DATEADD в MariaDB

0 голосов
/ 05 июня 2018

Я использую оператор DATEADD в SQL Server , и мне нужно перейти на MariaDB

  SUM (
    CASE
    WHEN CONVERT(varchar, Production.MadeDate , 112) BETWEEN DATE_ADD(DAY, -2, '2018-06-05') AND DATE_ADD(DAY, -2, '2018-06-05') THEN
      Production.Qty
    ELSE
      0
    END
  ) AS 'N-2'

И я получил такую ​​ошибку

[42000] [1064] В вашем синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с 'varchar, Production.MadeDate, 112) МЕЖДУ DATE_ADD (ДЕНЬ, -2,' 2018-06-05 ') И' в строке 3

У меня есть ссылки от MariaDB DATE_ADD и MariaDB ADDDATE но он все еще не работает

Моя версия MariaDB 10.1.32-MariaDB

РЕДАКТИРОВАТЬ:

[решено]

Изменение SQL Statment с CONVERT на CAST

  SUM (
    CASE
    WHEN CONVERT(varchar, Production.MadeDate , 112) BETWEEN DATE_ADD(DAY, -2, '2018-06-05') AND DATE_ADD(DAY, -2, '2018-06-05') THEN
      Production.Qty
    ELSE
      0
    END
  ) AS 'N-2'

TO

SUM (
    CASE WHEN CAST(Production.MadeDate AS DATE) BETWEEN DATE_ADD('2018-06-05', INTERVAL -2 DAY) AND DATE_ADD('2018-06-05', INTERVAL -2 DAY) THEN
        Production.Qty
    ELSE
        0
    END
) AS 'N-2'

Это работает для меня на

10.1.32-MariaDB

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Ни в одной базе данных не следует преобразовывать значения даты / времени в строки для сравнения.Я также не рекомендую использовать BETWEEN.Итак, я ожидал бы что-то подобное в MariaDB:

 SUM(CASE WHEN Production.MadeDate >= '2018-06-05' - INTERVAL 2 DAY AND
               Production.MadeDate < '2018-06-05' - INTERVAL 1 DAY
          THEN Production.Qty
          ELSE 0
     END) AS N_2

В SQL Server я бы написал это как:

SUM(CASE WHEN Production.MadeDate >= DATEADD(day, -2, '2018-06-05') AND
              Production.MadeDate < DATEADD(day, -1, '2018-06-05')
         THEN Production.Qty
         ELSE 0
    END) AS N_2

Обратите внимание на изменения:

  • Все сравнения выполняются с использованием собственных типов даты / времени.
  • N-2 изменяется на N_2, поэтому псевдоним столбца не нужно экранировать.
  • Дата /временные сравнения выполняются с использованием прямых сравнений, а не BETWEEN.
0 голосов
/ 05 июня 2018

Вы не можете использовать CONVERT следующим образом:

CONVERT(varchar, Production.MadeDate, 112)

Это синтаксис TSQL / MSSQL , и его нельзя использовать таким образом на MariaDB или MySQL.

Таким образом, вы можете попробовать заменить текущий CONVERT одним из следующих:

CONVERT(Production.MadeDate, DATE)  -- using CONVERT (ODBC syntax)
CAST(Production.MadeDate AS DATE)   -- using CAST (SQL92 syntax)

Вы можете попробовать следующий запрос, используя CAST и DATE_ADD:

SUM (
    CASE WHEN CAST(Production.MadeDate AS DATE) BETWEEN DATE_ADD('2018-06-05', INTERVAL -2 DAY) AND DATE_ADD('2018-06-05', INTERVAL -2 DAY) THEN
        Production.Qty
    ELSE
        0
    END
) AS 'N-2'

Примечание: Также проверьте условие на CASE WHEN.Вы проверяете между одними и теми же днями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...