【问题标题】:Strange result when calculating with mysql dates使用 mysql 日期计算时出现奇怪的结果
【发布时间】:2016-10-20 05:34:03
【问题描述】:

这个计算 select cast('2016-06-01 00:00:00' as datetime)-cast('2016-05-31 00:00:00' as datetime) 结果在 mySQL 中有 70 000 000。

我知道我不应该使用那个构造,但我很好奇 70000000 是什么?

【问题讨论】:

  • 在您减去的时间段内有86 400 000 毫秒。我不知道70 百万来自哪里。

标签: mysql datetime date-arithmetic


【解决方案1】:

@Drew所示,在执行减法时被视为BIGINT:

$ mysql --column-type-info

mysql> SELECT
    ->   `der`.`DATE_1`,
    ->   `der`.`DATE_2`,
    ->   `der`.`DATE_1` - `der`.`DATE_2` DIFF
    -> FROM (SELECT CAST('2016-06-01 00:00:00' AS DATETIME) `DATE_1`,
    ->              CAST('2016-05-31 00:00:00' AS DATETIME) `DATE_2`) `der`;
Field   1:  `DATE_1`
Catalog:    `def`
Database:   ``
Table:      `der`
Org_table:  ``
Type:       DATETIME
Collation:  binary (63)
Length:     19
Max_length: 19
Decimals:   0
Flags:      BINARY 

Field   2:  `DATE_2`
Catalog:    `def`
Database:   ``
Table:      `der`
Org_table:  ``
Type:       DATETIME
Collation:  binary (63)
Length:     19
Max_length: 19
Decimals:   0
Flags:      BINARY 

Field   3:  `DIFF`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       LONGLONG
Collation:  binary (63)
Length:     16
Max_length: 8
Decimals:   0
Flags:      BINARY NUM 

-- 20160601000000       20160531000000
+---------------------+---------------------+----------+
| DATE_1              | DATE_2              | DIFF     |
+---------------------+---------------------+----------+
| 2016-06-01 00:00:00 | 2016-05-31 00:00:00 | 70000000 |
+---------------------+---------------------+----------+
1 row in set (0,00 sec)

【讨论】:

  • 啊,一个更好的答案。干得好。
【解决方案2】:

首先,这不是减去日期或日期时间的方式。为此使用datedifftimediff。只是说。请参阅 MySQL Date and Time Functions

但是看着

select cast('2016-06-01 00:00:00' as datetime)-cast('2016-05-31 00:00:00' as datetime);

70000000

select cast('2016-06-01 00:00:00' as datetime)-cast('2016-05-30 00:00:00' as datetime);

71000000

select cast('2016-06-01 00:00:00' as datetime)-cast('2016-06-02 00:00:00' as datetime);

-1000000

select cast('2016-06-01 00:00:00' as datetime)-cast('123' as char(3) );

20160600999877;

可以看到它们被视为 bigint 的模式。所以

select  20160601000000 - 20160531000000;

70000000

select  20160601000000 - 20160530000000;

71000000

所以这似乎是原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2015-01-18
    • 2011-04-02
    • 1970-01-01
    • 2018-06-27
    • 2018-05-22
    相关资源
    最近更新 更多