1

我正在检查当前行和上一行之间的日期时间差异。

Pacific_Time 日期时间,

id int

SELECT A.id, A.Pacific_Time, B.id, B.Pacific_Time, 
A.Pacific_Time - B.Pacific_Time AS Time_Delta from TBL1 A 
JOIN TBL1 B 
ON A.id - 1 =B.id 
WHERE A.Pacific_Time - B.Pacific_Time > 5  
LIMIT 30;

我正在加入同一张桌子,但将它向下或向上移动一排。大多数行以 1 秒的间隔分隔。我正在搜索相隔超过 5 秒的行。问题是,当 Pacific_Time 从 59 秒到下一分钟的 0 秒时,它给出了 41 秒的增量,而实际上它是 1 秒的差异。这是一个例子:

A.id    A.Pacific_Time        B.id  B.Pacific_Time        (A.Pacific_Time - B.Pacific_Time )
50      2011-07-19 07:49:55   49    2011-07-19 07:49:54   1.000000
51      2011-07-19 07:49:56   50    2011-07-19 07:49:55   1.000000 
52      2011-07-19 07:49:57   51    2011-07-19 07:49:56   1.000000 
53      2011-07-19 07:49:58   52    2011-07-19 07:49:57   1.000000
54      2011-07-19 07:49:59   53    2011-07-19 07:49:58   1.000000 
55      2011-07-19 07:50:00   54    2011-07-19 07:49:59  41.000000
56      2011-07-19 07:50:01   55    2011-07-19 07:50:00   1.000000
57      2011-07-19 07:50:02   56    2011-07-19 07:50:01   1.000000
58      2011-07-19 07:50:03   57    2011-07-19 07:50:02   1.000000

我试过使用timediff()它给我正确的结果,但运行速度要慢得多。这是在一个有 20000 行的表上运行的,但它需要在一个接近一百万行的表上运行。

有什么建议吗?

mysql Ver 14.14 Distrib 5.5.29,适用于 debian-linux-gnu

4

2 回答 2

1

SELECT A.id, A.Pacific_Time, B.id, B.Pacific_Time, A.Pacific_Time - B.Pacific_Time AS Time_Delta from TBL1 A JOIN TBL1 B ON A.id - 1 =B.id WHERE TO_SECONDS(A.Pacific_Time) - TO_SECONDS(B.Pacific_Time) > 5 LIMIT 30;

请尝试此查询。

于 2013-06-21T18:18:07.550 回答
0

您将日期存储为 datetime 格式,因此不要将它们视为整数,而是使用 mysql INTERVAL 语法(来自date-and-time-functions):

 Date arithmetic also can be performed using INTERVAL together with the + or - operator:

date + INTERVAL expr unit
date - INTERVAL expr unit

因此,您的查询应如下所示:

SELECT A.id, A.Pacific_Time, B.id, B.Pacific_Time, 
A.Pacific_Time - B.Pacific_Time AS Time_Delta from TBL1 A 
JOIN TBL1 B 
ON A.id - 1 =B.id 
WHERE A.Pacific_Time > B.Pacific_Time + INTERVAL 5 second
LIMIT 30;

我可能是错的,但我认为使用 Pacific_Time 上的索引你不能更快。

于 2013-06-21T18:41:00.520 回答