MySQL 中的 Datepart 函数替代方案
SQL datepart
函数提取日期时间数据类型的一部分,用于过滤或聚合 SQL 数据库中的表字段。但是,它在 MySQL 中并不直接可用。
MySQL 中的 Datepart
函数替代方案
有两种方法可以实现与 MySQL 中的 datepart
类似的结果。
- 使用
Extract(datetime-part FROM datetime)
方法。 - 使用
datetime-part(datetime)
方法。
回想一下,datetime 数据类型是 MySQL 中可用的典型日期和时间数据类型的组合/串联。日期和时间通常具有各自的格式:YYYY-MM-DD
和 HH: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
参数可以是以下任何日期时间部分:MONTH
、MICROSECOND
、SECOND
、MINUTE
、HOUR
、DAY
、WEEK
、MONTH
、QUARTER
, 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
方法可以更清楚地说明执行的操作。
这种方法是代码可读性和调试的首选。