首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我在MariaDB中使用日期包括毫秒精度的between条件得到了不同的结果

我在MariaDB中使用日期包括毫秒精度的between条件得到了不同的结果
EN

Stack Overflow用户
提问于 2020-11-04 00:46:11
回答 3查看 42关注 0票数 0

我得到了下面的Sales表,其中包含列productName Varchar(50)saleDate bigint(20)

假设它存储了100条记录。

示例:

代码语言:javascript
运行
复制
productName saleDate
----------- ------------
TV          1601555334694
Radio       1603585354888
...

saleDate列存储在时间戳号中,日期的精度为毫秒。然后,我运行以下查询来获得2020年10月的销售数量:

代码语言:javascript
运行
复制
-- 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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-04 01:22:39

我建议将间隔界限转换为unix时间戳,而不是相反。这更简单,效率也更高:where谓词是SARGable (这意味着它可以利用saledate上的索引),而在原始查询中,需要转换整个列,然后才能对其进行过滤。

此外,使用半开放间隔可节省处理后续毫秒的时间。

所以:

代码语言:javascript
运行
复制
select count(*)
from sales
where saledate >= unix_timestamp('2020-10-01') * 1000
  and saledate <  unix_timestamp('2020-11-01') * 1000

如果你想偏移5小时10分钟,那么这是一个简单的技巧:

代码语言:javascript
运行
复制
select count(*)
from sales
where saledate >= (unix_timestamp('2020-10-01') + 5 * 60 * 60 + 10 * 60) * 1000
  and saledate <  (unix_timestamp('2020-11-01') + 5 * 60 * 60 + 10 * 60) * 1000
票数 1
EN

Stack Overflow用户

发布于 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中使用的时间中删除毫秒。

票数 1
EN

Stack Overflow用户

发布于 2020-11-04 01:20:11

只是想一想..。

代码语言:javascript
运行
复制
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT 99-i j FROM ints ORDER BY i;
+----+
| j  |
+----+
| 99 |
| 98 |
| 97 |
| 96 |
| 95 |
| 94 |
| 93 |
| 92 |
| 91 |
| 90 |
+----+

SELECT 99-i i FROM ints ORDER BY i;
+----+
| i  |
+----+
| 90 |
| 91 |
| 92 |
| 93 |
| 94 |
| 95 |
| 96 |
| 97 |
| 98 |
| 99 |
+----+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64667039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档