繁体   English   中英

这两条 SQL 语句有什么区别?

[英]What's the difference between the two SQL statements?

这是来自 leetcode 的一个问题,使用第二个查询我把问题弄错了,但无法确定原因

SELECT
    user_id,
    max(time_stamp) as "last_stamp"
from
    logins
where
    year(time_stamp) = '2020'
group by
    user_id

select
    user_id,
    max(time_stamp) as "last_stamp"
from
    logins
where
    time_stamp between '2020-01-01' and '2020-12-31'
group by
    user_id

第一个查询对每一行使用一个函数来提取年份(整数)并将其与字符串进行比较。 (最好改用整数。)虽然这可能不是最理想的,但此查询将准确定位到 2020 年的所有行。

第二个查询可能无法定位到 2020 年的所有行。重要的是要记住,日子有 24 小时的持续时间,每天从午夜开始,到 24 小时后的午夜结束。 那是; 一天确实有一个起点(午夜)和一个终点(午夜+24 小时)。

但是 SQL 代码中使用的单个日期不能同时是同一天的起点和终点,因此 SQL 中的每个日期都只代表起点。 还要注意的是, between不会神奇地将第二个给定日期更改为“那一天的结束” - 它根本不能(也不会)这样做。

因此,当您time_stamp between '2020-01-01' and '2020-12-31'时,您需要将其视为“从 2020-01-01 开始到并包括 2020-12 开始” -31 "。 因此,这不包括 2020-12-31 的 24 小时持续时间。

处理此问题的最安全方法是根本不使用between ,而是只编写几个字符的代码,这将是准确的,无论任何日期/日期时间/时间戳列使用的时间精度如何:

where
    time_stamp >= '2020-01-01' and time_stamp <'2021-01-01' 

第二个日期是“第二天的起点”

请参阅对SQL“之间”不包含的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM