簡體   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