MySQL 中的 Datepart 函数替代方案

Victor A. Oguntuase 2023年10月8日
  1. MySQL 中的 Datepart 函数替代方案
  2. 使用 MySQL 中的 Extract(datetime-part FROM datetime) 方法提取日期时间的一部分
  3. 使用 MySQL 中的 datetime-part(datetime) 方法提取日期时间的一部分
MySQL 中的 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 方法可以更清楚地说明执行的操作。

这种方法是代码可读性和调试的首选。

Victor A. Oguntuase avatar Victor A. Oguntuase avatar

Victor is an experienced Python Developer, Machine Learning Engineer and Technical Writer with interests across various fields of science and engineering. He is passionate about learning new technologies and skill and working on challenging problems. He enjoys teaching, intellectual discourse, and gaming, among other things.

LinkedIn GitHub

相关文章 - MySQL Function