2011-04-07 49 views
0

我有以下兩個查詢,我不知道有什麼更高效的做法:a)使用子查詢和內部連接或b)多次調用CONVERT_TZ()?子查詢與運行函數的效率是多少次?

或者也許有更有效的方法。任何想法將不勝感激!

查詢所做的是使用已存儲的偏移值將DATETIME從一個時區轉換爲另一個(EDT:GMT-4)。 在生產中運行此查詢時,我將擁有幾千條記錄。

USE weblist; 

SELECT metropolitan_area 
    ,date_time 
    ,gmt_offset 
    ,gmt_offset + 4 AS hours 
    ,CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') AS EDT 
    ,DAYOFMONTH(date_time) AS day 
    ,MONTH(date_time) AS month 
    ,DATE_FORMAT(date_time, '%h:%i %p') AS date_time_ 
    ,DAYOFMONTH(CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00')) AS dayEDT 
    ,MONTH(CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00')) AS monthEDT 
    ,DATE_FORMAT(CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') 
    ,'%h:%i %p') AS date_timeEDT 
    FROM weblist 
    ORDER BY gmt_offset DESC; 

SELECT cl.metropolitan_area 
    ,cl.date_time 
    ,edt.date_timeEDT 
    ,DAYOFMONTH(cl.date_time) dayOrg 
    ,MONTH(cl.date_time) AS monthOrg 
    ,TIME_FORMAT(cl.date_time, '%h:%i %p') AS dateTimeOrg 
    ,DAYOFMONTH(edt.date_timeEDT) dayEDT 
    ,MONTH(edt.date_timeEDT) AS monthEDT 
    ,TIME_FORMAT(edt.date_timeEDT, '%h:%i %p') AS dateTimeEDT 
    FROM (
    SELECT 
     id 
     ,CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') AS date_timeEDT 
    FROM weblist 
    ) edt 
    INNER JOIN weblist AS cl ON cl.id = edt.id 
    ORDER BY cl.gmt_offset DESC; 
+0

'WITH'在這裏會非常好,除了mysql不支持它... – dancek 2011-04-07 22:13:27

回答

0

我會投多個CONVERT。我想我已經讀過,mysql足夠聰明地注意到它們都是一樣的,所以它只會對每一行進行一次數學運算。

另外,想想當你想添加一個WHERE子句時會發生什麼。你是否總是記得將它添加到weblist中的內部和外部SELECT語句中?

+0

聽起來不錯。謝謝你的幫助! – Eric 2011-04-08 15:29:52

2

如果您想知道哪種效率更高,請確定您將使用哪些度量標準來衡量效率,然後對其進行度量。別的只是猜測。

+1

+1只需創建一個代碼,將隨機時間插入到測試表中,然後選擇時間以查看哪個更快。 – Johan 2011-04-07 22:51:02