日期和時間很重要,它們有助於保持事物的有序性,並且是任何軟體操作不可或缺的一個方面。
在資料庫中高效地使用它們有時看起來很混亂,不管是跨不同的時區工作、新增/減去日期,還是其他操作。
學習各種MySQL函式,以便輕鬆地處理和管理資料庫中的日期/時間。
為了幫助保持標準化,您應該只使用UTC時區中的日期/時間。每次建立到MySQL資料庫的連線時,都應該將時區切換到UTC,這可以透過以下SQL語句完成:
SET TIME_ZONE = '+0:00'由於所有日期現在都將儲存在UTC中,所以您總是知道您正在使用什麼,使事情更加簡單和直接。
必要時,您可以使用方便的convert\u TZ()MySQL函式輕鬆地轉換任何datetime/timestamp值的時區。首先需要知道偏移量,例如,北美西海岸的PST是UTC-08:00,因此可以使用:
SELECT CONVERT_TZ('2021-02-04 21:47:23', '+0:00', '-8:00');結果是2021-02-04 13:47:23,這是完全正確的。傳遞給CONVERT\u TZ()的三個引數是第一個開始的日期時間/時間戳(使用now()表示當前時間),第二個引數總是“+0:00”,因為資料庫中的所有日期都強制為UTC,最後一個引數是我們希望將日期轉換為的偏移量。
很多時候,您需要新增或減去日期,例如,如果您需要檢索一週前的記錄,或者從現在開始安排一個月的時間。
值得慶幸的是,MySQL擁有出色的DATE\u ADD()和DATE\u SUB()函式,使這項任務非常簡單。例如,可以使用SQL語句從當前日期減去兩週:
SELECT DATE_SUB(now(), interval 2 week);如果您希望在現有時間戳上新增三天,則可以使用:
SELECT DATE_ADD('2021-02-07 11:52:06', interval 3 day);兩個函式的工作原理相同,第一個引數是開始的時間戳,第二個引數是要加或減的間隔。第二個引數的格式總是相同的,從單詞interval開始,後跟一個數字值和interval本身,可以是以下任意值:second、minute、hour、day、week、month、quarter、year。
例如,如果要檢索過去34分鐘內發生的所有登入,可以使用SQL語句,例如:
SELECT * FROM logins WHERE login_date >= DATE_SUB(now(), interval 45 minute);如您所見,這將從logins表中檢索登入日期大於當前時間減去45分鐘的所有記錄,換句話說,就是過去的45分鐘。
有時你需要知道兩次約會之間經過了多少時間。使用DATEDIFF函式,您可以很容易地獲得兩個不同日期之間的天數,例如下面的SQL語句:
SELECT DATEDIFF(now(), '2020-12-15');DATEDIFF函式接受兩個引數,這兩個引數都是日期/時間戳,並給出它們之間的天數。上面的例子將顯示從2020年12月15日到今天的天數。
要獲取兩個日期之間的秒數,可以使用To_seconds()函式,例如:
SELECT TO_SECONDS(now()) - TO_SECONDS('2021-02-05 11:56:41');這將導致提供的兩個日期之間的秒數。
有各種MySQL函式可以讓您輕鬆地從日期中提取特定的片段,例如如果您只想要月份、一年中的某一天或某個小時。下面是一些此類函式的示例:
SELECT MONTH('2021-02-11 15:27:52'); SELECT HOUR(now()); SELECT DAYOFYEAR('2021-07-15 12:00:00');上面的SQL語句將導致02,即當前時間,以及196,因為9月15日是一年中的第196天。以下是所有可用日期提取函式的列表,每個函式只接受一個引數,提取的日期來自:
- SECOND()- MINUTE()- HOUR()- DAY()- WEEK() - Number 0 - 52 defining the week within the year.- MONTH()- QUARTER() - Number 1 - 4 defining the quarter of the year.- YEAR()- DAYOFYEAR() - The day of the year (eg. Sept 15th = 196).- LAST_DAY() - The last day in the given month.- DATE() - The date in YYYY-MM-DD format without the time.- TIME() The time in HH:II:SS format without the date.- TO_DAYS() - The number of days since A.D. 0.- TO_SECONDS() - The number of seconds since A.D. 0.- UNIX_TIMESTAMP() - The number of seconds since the epoch (Jan 1st, 1970)例如,如果您只想檢索建立所有使用者的月份和年份,則可以使用SQL語句,例如:
SELECT id, MONTH(created_at), YEAR(created_at) FROM users;這將檢索users表中的所有記錄,並顯示每個使用者在中建立的id、、月份和年份。
date函式的一個很好的用法是能夠在SQL語句中使用groupby按日期段對記錄進行分組。例如,您可能希望將2020年所有訂單的總金額按月份分組。您可以使用SQL語句,例如:
SELECT MONTH(created_at), SUM(amount) FROM orders WHERE created_at BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59' GROUP BY MONTH(created_at);這將檢索2020年下達的所有訂單,按建立的月份對其進行分組,並返回12條記錄,顯示年度每個月訂購的總金額。
請注意,為了獲得更好的索引效能,最好避免在SQL語句的WHERE子句中使用諸如YEAR()之類的日期函式,而是使用BETWEEN運算子,如上面的示例所示。
使用以上知識,您現在可以在各種用例中高效地處理、翻譯和執行日期和時間操作。
為了簡單起見,請記住在處理日期時始終使用UTC,並利用以上提示在軟體中有效地管理日期,無論是完成簡單的計算還是輕鬆地按日期週期分組的報表。
如果您對SQL有點陌生,請確保簽出這些基本的SQL命令,以幫助改進SQL使用。
如果你正在尋找一種更簡單的方式將你的電子郵件或待辦事項連線到你的日曆上,那麼只需使用Gmail即可。Google Chrome的這個擴充套件將透過完全連結的工具提高您的生產力。你可以節省時間,完成事情,永遠不會忘記一個方便的...
... 您的**使用一個名為hosts的檔案來定義如何連線到internet上的各種服務。有時,此檔案有問題,這會導致許多服務無法在您的**上執行,包括googleplay商店。 ...
... 下面介紹如何在本地和web上的Raspberry Pi和宿主網站上設定Apache、MySQL和PHP。 ...
... 讓我們探索如何從多個數據庫表中準確地檢索所需的資料,以及各種可用的聯接,這些聯接允許您提取所需的準確結果。 ...
...,哪些任務需要連續操作。在今天的環境中,你應該知道如何管理專案,並在不確定的情況下處理它們。為此,你需要接受培訓,最好的入門方法就是學習專案管理。 ...
Outlook最有用、最不易理解的選項之一是Follow-Up,它是該程式的電子郵件提醒工具。如果你在郵件不再出現在你收件箱的首頁後,很難記得回覆郵件,那麼這個工具就是為你準備的。 “跟進”會提醒您選擇某個日期的電子郵件,...