【问题标题】:DATEDIFF SQL QueryDATEDIFF SQL 查询
【发布时间】:2016-04-07 09:06:46
【问题描述】:

我正处于项目的最后阶段,无法找到工作是否过期。我将此链接到优先级,例如,如果作业的优先级为 1,则它必须在 1 天内完成,优先级为 4,然后 4 天。

我想出了一个 CASE,但这似乎没有任何帮助。

SELECT `defect_Id`,`Overtasked`
WHERE
    CASE DATEDIFF(DD,`date_Investigaton` - `CURRENT_DATE()`) >= `priority` AS Overtasked
    THEN `Overtasked` == 'YES'
    ELSE `Overtasked` == 'NO'
END

解决方案

  `SELECT defect_Id, 
   CASE WHEN DATEDIFF(date_Investigated, CURDATE()) >= priority 
   THEN 'YES' 
   ELSE 'NO' 
   END AS Overtasked 
   FROM defect_report 
   WHERE defect_Id = '82'`

感谢你们提供的指导!

【问题讨论】:

  • 标记使用的 dbms。那里有一些非 ANSI SQL...
  • 另外,删除 current_date() 周围的反引号。
  • 我正在使用 WAMP 服务器和 PHP myAdmin
  • 能否添加一些示例表数据,以及预期的结果?
  • DATEDIFF(DD, date_Investigaton - CURRENT_DATE()) -- 什么是DD?

标签: mysql sql datediff


【解决方案1】:

您完全混淆了 SQL 方言,甚至存在语法错误。 假设您正在谈论 MS SQL Server,让我们试试这个:

SELECT  defect_Id, 
        CASE WHEN DATEDIFF(DD, date_Investigaton, getdate()) >= priority
            THEN  'YES'
            ELSE  'NO'
        END AS Overtasked
FROM    <YourTable>
WHERE   <YourWhereIfAny> 

【讨论】:

  • 我假设反引号表示 MySQL。
【解决方案2】:

如果date_Investigation 是DATE 列,则减法date_Investigation - CURRENT_DATE() 会产生您需要的天数。

否则(例如,如果它是DATETIME)两个操作数都是converted to float,结果是您完全没有预料到的。对于这种情况,请使用DATEDIFF() 函数。它将其参数解释为DATE(忽略时间部分)并返回两个日期之间的整数天数。

您的查询应该是这样的:

SELECT
    `defect_Id`,
    IF (DATEDIFF(`date_Investigaton`, CURRENT_DATE()) >= `priority`, 'YES', 'NO')
        AS `Overtasked`
FROM [...your table name here...]
WHERE [...conditions...]

将方括号 ([...]) 中的部分替换为从中获取数据的表的名称以及一些限制返回行数的条件(否则它将获取整个表,这很可能是不是你想要的)。

顺便说一句,CURRENT_DATE() 也是一个函数。如果你把它写在反引号中(``),MySQL 会尝试查找具有此名称的列,它会失败。

阅读this question 的已接受答案。它解释了何时在 MySQL(部分在 PHP)中使用反引号、单引号或双引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    相关资源
    最近更新 更多