我得到了下面的Sales
表,其中包含列productName Varchar(50)
和saleDate bigint(20)
。
假设它存储了100条记录。
示例:
productName saleDate
----------- ------------
TV 1601555334694
Radio 1603585354888
...
saleDate
列存储在时间戳号中,日期的精度为毫秒。然后,我运行以下查询来获得2020年10月的销售数量:
-- This returns a result of 70
SELECT COUNT(*)
FROM (
SELECT productName,
DATE_FORMAT(SUBSTRING(DATE_ADD((FROM_UNIXTIME(SUBSTRING(saleDate, 1, 10)) -
INTERVAL (10+5*60) MINUTE), INTERVAL SUBSTRING(saleDate, 11, 13) SECOND_MICROSECOND),1,23), '%Y-%m-%d 00:00:00') AS saleDate
FROM Sales
) s
WHERE s.saleDate between '2020-10-01 00:00:00' and '2020-10-31 23:59:59.999'
-- This returns a result of 20
SELECT COUNT(*)
FROM (
SELECT productName,
DATE_FORMAT(SUBSTRING(DATE_ADD((FROM_UNIXTIME(SUBSTRING(saleDate, 1, 10)) -
INTERVAL (10+5*60) MINUTE), INTERVAL SUBSTRING(saleDate, 11, 13) SECOND_MICROSECOND),1,23), '%Y-%m-%d 00:00:00') AS saleDate
FROM Sales
) s
WHERE s.saleDate between '2020-10-01 00:00:00.000' and '2020-10-31 23:59:59.999'
在这两个查询中,我减去了5个小时的日期,但减少了10分钟。这是系统要求。
因此,当我用.000过滤开始日期时,结果会发生变化。70的结果不应该是一样的吗?
我使用的是Mariadb 10.2.13
发布于 2020-11-04 01:34:07
问题是您的DATE_FORMAT()
格式字符串不包括毫秒。因此,如果saleDate
的值恰好是2020-10-01 00:00:00
,它将不满足BETWEEN
条件,因为2020-10-01 00:00:00
在字典顺序上不高于2020-10-01 00:00:00.000
。
将毫秒添加到格式字符串'%Y-%m-%d 00:00:00.000'
中,或从BETWEEN
中使用的时间中删除毫秒。
https://stackoverflow.com/questions/64667039
复制相似问题