MariaDB中的DATEADD

时间:2018-06-05 06:31:59

标签: sql mariadb

我在 SQL Server 中使用DATEADD语句,我需要迁移到 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)BETWEEN DATE_ADD(DAY,   -2,' 2018-06-05')和'在第3行

我收到了MariaDB DATE_ADDMariaDB ADDDATE的推荐信,但它仍然无法正常工作

我的版本MariaDB 10.1.32-MariaDB

编辑:

[已解决]

SQL规则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'

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 :(得分:1)

你不能像这样使用CONVERT

CONVERT(varchar, Production.MadeDate, 112)

这是TSQL/MSSQL syntax,在MariaDB或MySQL上不能像这样使用。

因此,您可以尝试使用以下某项替换当前CONVERT

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

您可以使用CASTDATE_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上的条件。你在同一天检查。

答案 1 :(得分:0)

在没有数据库的情况下,您应该将日期/时间值转换为字符串进行比较。我也不鼓励使用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进行的。