[英]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.