2017-07-11 52 views
1

我試着找到這個問題的解決方案,但是我發現的所有內容都要求稍微不同的問題,或者沒有得到足夠的答案。我有以下設置的表:使用Self-Join查找行之間的差異

fullvna 

    +--------------+-------------+------+-----+---------+----------------+ 
    | Field  | Type  | Null | Key | Default | Extra   | 
    +--------------+-------------+------+-----+---------+----------------+ 
    | startdate | date  | YES |  | NULL |    | 
    | starttime | time  | YES |  | NULL |    | 
    | id   | int(11)  | NO | PRI | NULL | auto_increment | 
    +--------------+-------------+------+-----+---------+----------------+ 

我想找到每對連續行之間的時間差,所以= 1減去ID的開始時間= 2(表中有序ID的開始時間按時間順序排列)。我根據我查詢過什麼,我在這裏找到:http://www.mysqltutorial.org/mysql-tips/mysql-compare-calculate-difference-successive-rows/

create table difference as SELECT 
       one.id, 
          one.starttime, 
          two.starttime, 
          (one.starttime - two.starttime) AS diff 
      FROM 
          fullvna one 
              INNER JOIN 
          fullvna two ON two.id = one.id + 1; 

我收到下面的打印輸出,並且我不知道這意味着什麼或者什麼,我做錯了:

ERROR 1064 (42000): You have an error in your SQL syntax; check the 
    manual that corresponds to your MySQL server version for the right 
    syntax to use near '  one.starttime, 
        two.starttime, 
        (one.starttime - two.starttime' at line 3 
+2

您應該使用[TIMEDIFF(表達式1,表達式2)(http://www.w3resource.com/mysql/date-and-time-functions/mysql-timediff-function.php) –

+0

更改該行基本上返回相同的錯誤。現在日期和時間被分成兩個單獨的列而不是一個日期時間值。那是爲什麼? – Caitlin

+0

沒有意義。 \t [**如何創建最小,完整和可驗證的示例**](http://stackoverflow.com/help/mcve) \t嘗試在http://rextester.com中創建示例 –

回答

2

你有隱藏的字符顯示爲空格,但他們不是,他們造成的錯誤。從我的答案複製查詢。而胡安建議,推薦使用的,而不是減去他們TIMEDIFF()功能:

CREATE TABLE difference AS 
SELECT one.id, 
     one.starttime AS starttime, 
     two.starttime AS endtime, 
     TIMEDIFF(one.starttime, two.starttime) AS diff 
FROM fullvna one 
INNER JOIN fullvna two ON two.id = one.id + 1; 

編輯作爲xQbert提到的,你需要爲starttime列使用不同的名稱,所以我糾正了上面的查詢相應。

+0

我需要創建一個表,因爲我將在稍後對結果運行查詢。運行此操作會產生與我以前收到的錯誤相同的錯誤。「 – Caitlin

+0

」錯誤1064(42000):您的SQL語法錯誤;請查看與您的MySQL服務器版本對應的手冊,以在'one.starttime, two.starttime, TIMEDIFF(one.starttime ,two.st'at line 2「 – Caitlin

+0

check @xQbert comment。'one'是一個保留字 –

3
  • 不要使用別名one因爲它是一個關鍵字選擇一個不同的一個
  • 別名STARTIME爲兩列具有相同名稱在create table將無法正常工作。
  • timeDiff測量(如在評論中提到的其他人)

CREATE TABLE difference as 
SELECT a1.id 
     , a1.starttime as OneStartTime 
     , a2.starttime as TwoStartTime 
     , TIMEDIFF(a1.starttime, a2.starttime) AS diff 
FROM fullvna a1 
INNER JOIN fullvna a2 
    ON a2.id = a1.id + 1; 
+1

看起來真正的問題是重複的列名稱。這是一個工作[DEMO](http://rextester.com/FFCZ42748)別名'''',即使保留不會給出任何錯誤。 –

+2

Na真正的問題是非顯示字符(除空格外),然後是列名。 – xQbert

+0

什麼非顯示字符?以及你如何看待它? –