为什么在MySQL中使用20,000年会产生不同的结果

时间:2017-11-10 06:10:56

标签: mysql sql

当我在MYSQL(版本5.6.37)上运行以下两个查询时使用完全相同的表我得到了非常不同的结果,这对我来说没有意义......

SELECT COUNT(*) FROM salesTransactions WHERE date<'2000-01-01'

我得到159个结果(如预期的那样)。然而,当我然后运行相同的报告但将年份增加到20,000时,我得到了完全不同的结果:

SELECT COUNT(*) FROM salesTransactions WHERE date<'20000-01-01'

我得到了结果6.

怎么可能?如果我将日期更改为30,000,我会得到预期的结果计数。我玩过,20100年有8个结果,这是另一个数字。

表格是:

ID:整数 日期:日期 名称:varchar(32)

这怎么可能?

1 个答案:

答案 0 :(得分:1)

DATE类型用于具有日期部分但没有时间部分的值。 MySQL以'YYYY-MM-DD'格式检索并显示DATE值。支持的范围是“1000-01-01”到“9999-12-31”。 DATETIME类型用于包含日期和时间部分的值。 MySQL以'YYYY-MM-DD HH:MM:SS'格式检索并显示DATETIME值。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。 TIMESTAMP数据类型用于包含日期和时间部分的值。 TIMESTAMP的范围为'1970-01-01 00:00:01'UTC到'2038-01-19 03:14:07'UTC。 (https://dev.mysql.com/doc/refman/5.7/en/datetime.html

有趣的是,您可能希望隐式日期转换返回null,因此查询将不返回任何内容。所以我做了一点测试。

Select count(*) from awsalesorderheader
union all
select count(*) from awsalesorderheader where orderdate < '9999-01-01' 
union all
select count(*) from awsalesorderheader where orderdate < '20049-01-01' 
union all
select count(*) from awsalesorderheader where orderdate < '20050-01-01' 
union all
select count(*) from awsalesorderheader where orderdate < '20070-01-01' 
union all
select count(*) from awsalesorderheader where orderdate < '10000-01-01' 
union all
select count(*) from awsalesorderheader where orderdate < '40000-01-01' 
union all
select count(*) from awsalesorderheader where orderdate < '30000-01-01' 
union all
select count(*) from awsalesorderheader where orderdate < null 
;

+----------+
| count(*) |
+----------+
|    31466 |
|    31466 |
|        0 |
|     1379 |
|    17514 |
|        0 |
|    31466 |
|    31466 |
|        0 |
+----------+
9 rows in set (0.26 sec)

请注意20049-01-01有一个截止点,之后我开始计算&gt;我的想法跳到了(可能是错误的)结论,即y2k还没有消失。