【问题标题】:MySQL query with DATEDIFF使用 DATEDIFF 的 MySQL 查询
【发布时间】:2015-04-29 07:46:25
【问题描述】:

我正在尝试构建一个查询,该查询将在比较 2 个字段(开始时间和结束日期)的特定日期之间加载记录。

SELECT start_time
,end_time
,DATEDIFF(end_time, start_time) AS DiffDate
FROM my_tbl
WHERE start_time >= '2015-04-27 00:00:00'
AND end_time <= '2015-04-28 00:00:00'
AND end_time >= '2015-04-27 00:00:00'
AND DiffDate < 100
LIMIT 1000;

不幸的是,DiffDate 总是返回 0。 理想的情况是在插入 end_time 时计算 start_time 和 end_time 之间的差异,但我无法对数据库进行任何更改。 我在这里做错了什么?即使 DiffDate 有效,它是否会被视为一个好的解决方案?

【问题讨论】:

  • 你希望日期差异是什么?小时分钟天周等?
  • 你检查过 BETWEEN 运算符吗?

标签: mysql sql datediff


【解决方案1】:

从 where 子句中的条件看来,您正在尝试获取同一日期的数据,但是在同一天使用 datediff 总是会导致 0

mysql> select datediff('2015-04-27 12:00:00','2015-04-27 00:00:00') as diff ;
+------+
| diff |
+------+
|    0 |
+------+

1 row in set (0.03 sec)

您可能需要其他计算方式,也许使用timestampdiff

mysql> select timestampdiff(minute ,'2015-04-27 00:00:00','2015-04-27 12:00:00') as diff ;
+------+
| diff |
+------+
|  720 |
+------+
1 row in set (0.00 sec)

另外,您在 where 子句中使用别名,这是不允许的,您必须将其更改为 have 子句

SELECT start_time
,end_time
,timestampdiff(minute,start_time,end_time) AS DiffDate
FROM my_tbl
WHERE start_time >= '2015-04-27 00:00:00'
AND end_time <= '2015-04-28 00:00:00'
AND end_time >= '2015-04-27 00:00:00'
having DiffDate < 100
LIMIT 1000;

【讨论】:

  • 感谢您的提示。这个查询是否被认为是好的做法?
  • 对于小型数据集不会有任何性能问题,但是当数据增长时,您可以在start_timeend_time 以及limit 上添加索引,而没有order by 没有意义,所以你可以考虑在进行限制的同时对数据进行排序。
  • “在开始和结束时间添加索引”到底是什么意思?我无法对数据库进行任何更改。仅用于检索数据
  • 我明白了indexes 使数据检索更快。如果您没有该权限,我相信数据库管理员将拥有并且他/她会处理它。
【解决方案2】:

来自 MS SQL,我使用的是 DATEDIFF,但解决方案是:

SELECT start_time
,end_time
,TIMESTAMPDIFF(SECOND,start_time,end_time) AS DiffDate
FROM my_tbl
WHERE start_time >= '2015-04-27 00:00:00'
AND end_time <= '2015-04-28 00:00:00'
AND end_time >= '2015-04-27 00:00:00'
AND DiffDate < 100
LIMIT 1000;

我想知道是否有更好的解决方案。

【讨论】:

    【解决方案3】:
    Start_time and end_time are datetime column. So use TimeDIFF..
    
    SELECT start_time, end_time, TIMEDIFF(end_time, start_time) AS DiffDate
    FROM my_tbl
    WHERE start_time >= '2015-04-27 00:00:00'
    AND end_time <= '2015-04-28 00:00:00'
    AND end_time >= '2015-04-27 00:00:00'
    AND DiffDate < 100
    LIMIT 1000;
    

    【讨论】:

      【解决方案4】:

      SELECT start_time,end_time,DATEDIFF(end_time, start_time) AS DiffDate FROM my_tbl WHERE start_time >= '2015-04-27 00:00:00' AND end_time between '2015-04-27 00:00:00' AND '2015-04-28 00:00:00' ANDfor date diff< 100 LIMIT 1000;

      【讨论】:

        猜你喜欢
        • 2011-12-04
        • 1970-01-01
        • 2013-03-21
        • 2016-04-21
        • 1970-01-01
        • 2022-09-25
        • 1970-01-01
        • 1970-01-01
        • 2012-12-24
        相关资源
        最近更新 更多