HOWTO · MySQL

MySQL 中的 Datepart 函式替代方案

本教程說明了用於在 MySQL 中提取部分日期時間的通用 SQL datepart 函式的替代方法。

SQL datepart 函式提取日期時間資料型別的一部分,用於過濾或聚合 SQL 資料庫中的表欄位。但是,它在 MySQL 中並不直接可用。

MySQL 中的 Datepart 函式替代方案

有兩種方法可以實現與 MySQL 中的 datepart 類似的結果。

  1. 使用 Extract(datetime-part FROM datetime) 方法。
  2. 使用 datetime-part(datetime) 方法。

回想一下,datetime 資料型別是 MySQL 中可用的典型日期和時間資料型別的組合/串聯。日期和時間通常具有各自的格式:YYYY-MM-DDHH:MM:SS.XXXXXX

因此,日期時間資料型別具有 YYYY-MM-DD HH:MM:SS.XXXXXX 格式,其中 .XXXXXX 表示 MySQL 中可用的 6 位小數秒精度 (fps)。

現在,讓我們建立一個簡單的 registration_system 資料庫來實現兩種日期時間提取方法。

-- Initializing
CREATE DATABASE registration_system;
USE registration_system;

-- CREATING TABLES
CREATE TABLE registered_users (
	id INT AUTO_INCREMENT UNIQUE,
    username VARCHAR (255) NOT NULL,
    email VARCHAR(255),
    registered_on DATETIME(6),	-- YYYY-MM-DD HH:MM:SS.XXXXXX
    PRIMARY KEY(id)
);

輸出:

1 row(s) affected
-----------------------------------------------------------------------------------------
0 row(s) affected
-----------------------------------------------------------------------------------------
0 row(s) affected

我們可以通過在建立的表中插入值來模擬一組註冊使用者。

-- POPULATING THE TABLE WITH SAMPLE REGISTRATION DATA: 3 users
INSERT INTO registered_users(username, email, registered_on) Values
	('Clint Rotterdam', 'clint_rotterdam@trialmail.com','2022-01-03 09:25:23.230872'),
    ('David Maxim', 'maxim_david@testmail.com','2022-01-05 10:30:24.046721'),
	('Vin Petrol', 'vin_not_diesel@crudemail.com','2022-01-30 14:05:03.332891');

輸出:

3 row(s) affected Records: 3  Duplicates: 0  Warnings: 0

這是建立的使用者表的檢視。

SELECT * FROM registered_users;    -- Checking the table

輸出:

id	username			email								registered_on
1	Clint Rotterdam		clint_rotterdam@trialmail.com		2022-01-03 09:25:23.230872
2	David Maxim			maxim_david@testmail.com			2022-01-05 10:30:24.046721
3	Vin Petrol			vin_not_diesel@crudemail.com		2022-01-30 14:05:03.332891
-----------------------------------------------------------------------------------------
3 row(s) returned

使用 MySQL 中的 Extract(datetime-part FROM datetime) 方法提取日期時間的一部分

此方法與無處不在的 SELECT 語句相結合。

datetime-part 引數可以是以下任何日期時間部分:MONTHMICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTER, YEAR, SECOND_MICROSECOND, MINUTE_MICROSECOND, MINUTE_SECOND, HOUR_MICROSECOND, HOUR_SECOND, HOUR_MINUTE, DAY_MICROSECOND, DAY_SECOND, DAY_MINUTE, DAY_HOUR, YEAR_MONTH

以下是這些選項的官方文件以供額外參考。

讓我們舉個例子。我們將從資料庫中獲取 1 月 30 日之前註冊的使用者的詳細資訊。

SELECT id AS 'USER_ID', username AS 'NAME', EXTRACT(DAY FROM registered_on) AS 'Day Registered'
FROM registered_users
WHERE EXTRACT(DAY FROM registered_on) < 30;

輸出:

USER_ID		NAME				Day Registered
1			Clint Rotterdam		3
2			David Maxim			5
-----------------------------------------------------------------------------------------
2 row(s) returned

此輸出通知兩件事。Extract 功能更改了輸出檢視並過濾了結果。

然後,許多應用程式都可以通過編寫操作日期時間的非常高階的查詢來使用。有關此功能的額外參考,請檢視官方文件

使用 MySQL 中的 datetime-part(datetime) 方法提取日期時間的一部分

此方法與前者類似,但引數較少。此外,結合 SELECT 語句,此方法可以根據所需的日期時間部分過濾列。

同樣,讓我們​​獲取 1 月 30 日之前註冊的使用者。

SELECT id AS 'USER_ID', username AS 'NAME', DAY(registered_on) AS 'Day Registered'
FROM registered_users
WHERE DAY(registered_on) < 30;

輸出:

USER_ID		NAME				Day Registered
1			Clint Rotterdam		3
2			David Maxim			5
-----------------------------------------------------------------------------------------
2 row(s) returned

通過使用 Date 過濾器,可以進一步改進此結果,如下例所示。

SELECT id AS 'USER_ID', username AS 'NAME', DATE(registered_on) AS 'Date Registered' FROM registered_users
WHERE DAY(registered_on) < 30;

輸出:

USER_ID		NAME				Date Registered
1			Clint Rotterdam		2022-01-03
2			David Maxim			2022-01-05
-----------------------------------------------------------------------------------------
2 row(s) returned

任何一種方法都提供相同的結果。但是,Extract 方法可以更清楚地說明執行的操作。

這種方法是程式碼可讀性和除錯的首選。