【问题标题】:Select all data different second between two date times选择两个日期时间之间不同秒的所有数据
【发布时间】:2017-01-09 04:32:50
【问题描述】:

我有一个 mysql 表,其中的数据连接到日期和时间。每行都有数据和日期,如下所示:

datetime               name
2009-06-25 10:00:00    jhon
2009-06-25 10:00:05    jack
2009-06-25 10:00:11    json
2009-06-25 10:00:15    jack

我的问题是我需要像这样获取不同的第二个 date1 和 date2 行:

datetime               name     second
2009-06-25 10:00:00    jhon     0
2009-06-25 10:00:05    jack     5
2009-06-25 10:00:11    json     6
2009-06-25 10:00:15    jack     4

谢谢

【问题讨论】:

  • 对,我删评论
  • 使用自加入来获得这个

标签: mysql datetime between


【解决方案1】:

您正在寻找的功能是LAG,它在许多数据库中可用作分析功能,但在 MySQL 中不可用。但是,您可以使用会话变量来模拟此功能。

SET @dt = (SELECT MIN(UNIX_TIMESTAMP(datetime)) FROM yourTable);

SELECT t.datetime,
       t.name,
       t.curr_dt - t.lag_dt AS second
FROM
(
    SELECT @dt:=UNIX_TIMESTAMP(datetime) curr_dt,
           @dt lag_dt,
           datetime,
           name
    FROM yourTable
    ORDER BY datetime, name
) t

【讨论】:

  • 这个方法很快
  • @tim ..它在所有行中显示秒差为零..不是用户预期的..sqlfiddle.com/#!9/a295e8/3
  • @AnkitAgrawal 会话变量似乎在 Fiddle 中不起作用。您需要在实际的 Workbench 中对其进行测试。
  • @TimBiegeleisen 我在本地也做了同样的事情......但结果还是一样
【解决方案2】:

您可以找到最近的日期并找到如下所示的差异

select 
    datetime,
    name,
    TIME_TO_SEC(TIMEDIFF(datetime, prev_date)) diff
    FROM
    (
        SELECT 
        datetime,
        name,
        (select datetime from tbl t1 where t1.datetime<tbl.datetime order by  datetime desc limit 1) as prev_date
        FROM 
        `tbl`
      )tmp

【讨论】:

  • 这是我给出的答案的一个很好的替代方案,对于合理大小的数据集应该没问题。
【解决方案3】:

结果是:

[SQL]SET @dt = (SELECT MIN UNIX_TIMESTAMP(datetime) FROM gps_trs_location); [Err] 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“(datetime) FROM gps_trs_location)”附近使用正确的语法

【讨论】:

  • 抱歉,错字,请使用:SET @dt = (SELECT MIN(UNIX_TIMESTAMP(datetime)) FROM yourTable);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2012-10-31
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多