2011-06-10 60 views
3

這是一個後續的another question,但我認爲權證自身的問題:我可以在TIMESTAMPDIFF中使用字段作爲'單位'嗎?

我可以用一個字段作爲TIMESTAMPDIFF()的「單位」參數?

例如,這裏有一個片段:

SELECT foo FROM table t LEFT JOIN frequencies f USING (frequency_id) 
WHERE MOD(TIMESTAMPDIFF(f.frequency_code, t.date, NOW()), t.frequency_num) = 0 

當我運行它這得到一個語法錯誤。現在,如果我將f.frequency_code替換爲實際的字 - MINUTE,DAY等 - 它的工作原理。但這些正是f.frequency_code中包含的字詞。

難道不能在該位置使用表格字段嗎?

+0

無需看着MySQL的源代碼,看看什麼是真正的接受,我會想沒有 - 如果你得到一個語法錯誤,那麼顯然mysql並不期望在那個地方獲得一個字段名。一種可能的選擇是嘗試返回間隔名稱的子查詢,但我懷疑它也可以。很有可能MySQL的解析器期望找到一個文字間隔名稱,並且只能找到該文字間隔名稱。 – 2011-06-10 14:19:53

+0

你總是可以使用嵌套的IF結構,但這會產生可怕的代碼。有興趣看看是否有任何事情發生 - 雖然這可能是不可能的 – 2011-06-10 14:19:54

回答

6

TIMESTAMPDIFF()不支持那樣的動態單位。

由於您正在使用已知的單位集,因此您可以使用CASE語句來實現此目的。

你的榜樣查詢開始,這樣的事情可能會工作:

SELECT foo 
FROM table t 
LEFT JOIN frequencies f USING (frequency_id) 
WHERE MOD(
(CASE 
    WHEN f.frequency_code = 'MICROSECOND' THEN TIMESTAMPDIFF(MICROSECOND, t.date, NOW()) 
    WHEN f.frequency_code = 'SECOND' THEN TIMESTAMPDIFF(SECOND, t.date, NOW()) 
    WHEN f.frequency_code = 'MINUTE' THEN TIMESTAMPDIFF(MINUTE, t.date, NOW()) 
    WHEN f.frequency_code = 'HOUR' THEN TIMESTAMPDIFF(HOUR, t.date, NOW()) 
    WHEN f.frequency_code = 'DAY' THEN TIMESTAMPDIFF(DAY, t.date, NOW()) 
    WHEN f.frequency_code = 'WEEK' THEN TIMESTAMPDIFF(WEEK, t.date, NOW()) 
    WHEN f.frequency_code = 'MONTH' THEN TIMESTAMPDIFF(MONTH, t.date, NOW()) 
    WHEN f.frequency_code = 'QUARTER' THEN TIMESTAMPDIFF(QUARTER, t.date, NOW()) 
    WHEN f.frequency_code = 'YEAR' THEN TIMESTAMPDIFF(YEAR, t.date, NOW()) 
    END) 
, t.frequency_num) = 0 
+0

雖然它可能看起來像醜陋的代碼,但這是我一起去的方法。謝謝! – Andrew 2011-06-17 14:45:13

0

不是100%,但您可以設法通過creating a function解決問題,即準備並執行dynamic sql

+0

嘗試,但它似乎並不想要。好主意,但。 – Andrew 2011-06-10 14:42:35

相關問題