在使用数学创建相对日期时,是否总是需要在MySQL中使用区间函数?
我在MS-Access 2010中使用Date() – Weekday(Date())并尝试在MySQL中使用curdate() – dayofweek(curdate()).我得到了一些不起眼的数字,在搜索后发现this StackOver answer完成了我想要的东西.
阅读完this support article后我想确定我理解这一点 – 任何时候我想用日期函数做简单的数学运算,我必须使用区间函数并声明我想要使用的单位时间?
如果我不使用区间函数,那么我从curdate() – dayofweek(curdate())获得的数字是否有用?
我之前从未使用过间隔,而我只是习惯于将日期格式和数字格式视为同一个格式的MS产品.寻找一些澄清.
解决方法:
从curdate() – dayofweek(curdate())返回的数字是没有用的.
SELECT curdate() - dayofweek(curdate())
+----------------------------------+
| curdate() - dayofweek(curdate()) |
+----------------------------------+
| 20140097 |
+----------------------------------+
您正在查看的是20140103号减去数字6的结果,它与任何可用日期没有任何相似之处:
> select 20140103 - 6;
+--------------+
| 20140103 - 6 |
+--------------+
| 20140097 |
+--------------+
因为您没有使用INTERVAL,所以MySQL似乎将日期2014-01-03转换为数字20140103,而减去当前工作日(6)的结果是无意义的. (我实际上对这件事感到惊讶 – 我本来预料到错误或结果不同1).
您需要使用INTERVAL说明符进行简单算术或使用许多MySQL’s date/time functions.
在某些情况下,如果通过UNIX_TIMESTAMP(datetime),FROM_UNIXTIME(datetime)将值转换为整数作为Unix时间戳,则可以使用INTERVAL.尽管如此,但是我还是建议使用真实的日期/时间函数来处理实际的DATE / DATETIME值.
select curdate() - INTERVAL dayofweek(curdate()) DAY;
+-----------------------------------------------+
| curdate() - INTERVAL dayofweek(curdate()) DAY |
+-----------------------------------------------+
| 2013-12-28 |
+-----------------------------------------------+
1 row in set (0.00 sec)
这还差不多 :)
1我没有对发生的铸造行为有任何解释,因为我原本期望这样做.不用说,这不是你应该使用或依赖的东西:
SELECT CAST('2014-01-03' AS UNSIGNED);
+------------------------------+
| CAST('2014-01-03' AS UNSIGNED) |
+------------------------------+
| 2014 |
+------------------------------+
……实际上,这里是将DATE转换为无符号INTEGER:
SELECT CAST(STR_TO_DATE('2014-01-03', '%Y-%m-%d') AS UNSIGNED);
+---------------------------------------------------------+
| CAST(STR_TO_DATE('2014-01-03', '%Y-%m-%d') AS UNSIGNED) |
+---------------------------------------------------------+
| 20140103 |
+---------------------------------------------------------+