这是对another question的跟进,但我认为值得提出自己的问题:
我可以在TIMESTAMPDIFF()
中使用字段作为'unit'参数吗?
例如,这是一个片段:
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 :(得分: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
答案 1 :(得分:0)
不是100%,但您可能会设法通过准备和执行creating a function的dynamic sql解决问题。