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
無需看着MySQL的源代碼,看看什麼是真正的接受,我會想沒有 - 如果你得到一個語法錯誤,那麼顯然mysql並不期望在那個地方獲得一個字段名。一種可能的選擇是嘗試返回間隔名稱的子查詢,但我懷疑它也可以。很有可能MySQL的解析器期望找到一個文字間隔名稱,並且只能找到該文字間隔名稱。 – 2011-06-10 14:19:53
你總是可以使用嵌套的IF結構,但這會產生可怕的代碼。有興趣看看是否有任何事情發生 - 雖然這可能是不可能的 – 2011-06-10 14:19:54