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

Tre*_*r D 3 mysql date intervals

interval在使用数学创建相对日期时,是否总是需要在MySQL中使用该函数?

Date()-Weekday(Date())在MS-Access 2010中使用并curdate() - dayofweek(curdate())在MySQL中尝试过.我得到了一些不起眼的数字,在搜索后发现这个StackOver答案可以完成我想要的.

在阅读了这篇支持文章后,我想确保我理解这一点 - 任何时候我想用日期函数做简单的数学运算,我必须使用区间函数并声明我想要使用的单位时间?

如果我不使用区间函数,我得到的数字是否有用curdate() - dayofweek(curdate())

我以前从未使用interval过,而我只是习惯于将日期格式和数字格式视为同一个格式的MS产品.寻找一些澄清.

Mic*_*ski 5

没有使用你从回来的数量curdate() - dayofweek(curdate()).

SELECT curdate() - dayofweek(curdate())

+----------------------------------+
| curdate() - dayofweek(curdate()) |
+----------------------------------+
|                         20140097 |
+----------------------------------+
Run Code Online (Sandbox Code Playgroud)

您正在查看的是数字20140103减去数字的结果,6它与任何可用日期没有任何相似之处:

> select 20140103 - 6;
+--------------+
| 20140103 - 6 |
+--------------+
|     20140097 |
+--------------+
Run Code Online (Sandbox Code Playgroud)

因为您没有使用INTERVAL,MySQL似乎已将日期2014-01-03转换为数字,20140103并且当减去当前工作日(6)时的结果是无意义的.(我真的很惊讶发生了 - 我本来预料到错误或不同的结果1).

需要使用INTERVAL使用许多简单的算术符或当MySQL的日期/时间函数.

在某些情况下,INTERVAL如果您将值转换为整数和从整数转换为Unix时间戳,则可以使用UNIX_TIMESTAMP(datetime), FROM_UNIXTIME(datetime).尽管如此,但是我还是建议使用真实的日期/时间函数来DATE/DATETIME尽可能地使用实际值.

select curdate() - INTERVAL dayofweek(curdate()) DAY;
+-----------------------------------------------+
| curdate() - INTERVAL dayofweek(curdate()) DAY |
+-----------------------------------------------+
| 2013-12-28                                    |
+-----------------------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

那更像是 :)


1我没有对发生的铸造行为有任何解释,因为我原本期望这样做.不用说,这不是你应该使用或依赖的东西:

SELECT CAST('2014-01-03' AS UNSIGNED);
+------------------------------+
| CAST('2014-01-03' AS UNSIGNED) |
+------------------------------+
|                         2014 |
+------------------------------+
Run Code Online (Sandbox Code Playgroud)

......实际上,这里是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 |
+---------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)