MySQL中的日期时算术需要INTERVAL吗?

在使用数学创建相对日期时,是否总是需要在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 |
+---------------------------------------------------------+
上一篇:[LeetCode] 56. Merge Intervals


下一篇:寻找右区间