在MySQL中使用日期和时间函数时,如DATEADD,是否可以将间隔单位存储在列中并在查询中使用?
例如,考虑下表:
+---------------------------+---------------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------------+---------------------------------------------------+------+-----+---------+----------------+
| snapshotSchedule_entry_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| snapshotSchedule_id | int(10) unsigned | NO | PRI | NULL | |
| everyFrequency | smallint(5) unsigned | NO | | NULL | |
| everyInterval | enum('minute','hour','day','week','month','year') | NO | | NULL | |
| afterFrequency | smallint(5) unsigned | NO | | NULL | |
| afterInterval | enum('minute','hour','day','week','month','year') | NO | | NULL | |
+---------------------------+---------------------------------------------------+------+-----+---------+----------------+
以下查询可以正常工作,因为它只处理间隔表达式:
select * from snapshotSchedule_entry order by date_add(now(), interval everyFrequency month);
当我想处理间隔单位(例如,月,年等)时,它不会解释它。
mysql>; 选择*from snapshotSchedule_entry order by date_add(now(),interval 1 everyInterval);错误1064(42000):SQL语法中有错误; 请查看与MySQL server版本相对应的手册,以便在第1行使用“every interval)”附近的正确语法
我对这种行为并不感到惊讶,我只是好奇是否有可能使它工作。 用代码做这件事并不是世界末日,但我想知道这是否可能。
MySQL在使用间隔表达式时没有那么灵活。 您需要一个带有硬编码值的大case
表达式:
order by case everyInterval
when 'minute' then now() + inteval everyFrequency minute
when 'hour' then now() + inteval everyFrequency hour
when 'day' then now() + inteval everyFrequency day
when 'week' then now() + inteval everyFrequency week
when 'month' then now() + inteval everyFrequency month
when 'year' then now() + inteval everyFrequency year
end
一个更简单的替代方案是重新设计您的模式,以固定的频率存储时间间隔,比如秒和月。 然后您可以执行以下操作:
order by now()
+ interval everyFrequencySecond second
+ interval everyFrequencyMonth month