【问题标题】:DATEADD in MariaDBMariaDB 中的 DATEADD
【发布时间】:2018-06-05 06:31:58
【问题描述】:

我在 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') AND ' 在第 3 行

我收到了来自 MariaDB DATE_ADD 和 MariaDB 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

【问题讨论】:

  • 我不明白你的WHERE 子句应该检查什么。从逻辑上讲,日期范围是两端相同的日期。您可以在您的问题中添加一些示例数据吗?
  • 为什么在将 Date 与 Date 进行比较之前将其转换为 VarChar?
  • @dnoeth - 也许是为了摆脱时间部分?
  • @RickJames:是的,可能是 SQL Server 中的 DateTime。但是CAST(timestampCol AS DATE) 更简单:-)

标签: sql mariadb


【解决方案1】:

你不能像这样在 MariaDB / MySQL 上使用CONVERT:

CONVERT(varchar, Production.MadeDate, 112)

参数的顺序在 MariaDB / MySQL 上无效。参数的顺序类似于TSQL / SQL Server syntax。

因此,您可以将当前的CONVERT 替换为以下之一:

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

您可以通过CAST 和DATE_ADD 使用以下SUM:

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 的条件。您在同一天之间进行检查。

【讨论】:

  • 所以我不能使用CONVERT? DATE_ADD 怎么样?
  • @Aldan:嗯,你在 MariaDB 手册中找到了 DATE_ADD 的条目,我怀疑他们会在不支持的情况下添加它。
  • Sebastian Brosch 和 dnoeth 非常感谢,它对我有用。
【解决方案2】:

在任何数据库中,您都不应该将日期/时间值转换为字符串以进行比较。我也不鼓励使用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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多