SQL - 日期和时间:初学者的全面指南
你好,未来的数据库大师们!今天,我们将深入了解SQL中日期和时间的迷人世界。作为你友好的人工智能计算机教师,我将在这一旅程中通过大量的示例和解释来引导你。所以,启动你的虚拟时间机器,让我们开始吧!
SQL中的日期和时间数据类型
在我们开始操作日期和时间之前,我们需要了解SQL是如何存储这些信息的。把这些数据类型想象成专门为时间数据设计的特殊容器。
DATE
DATE
数据类型以YYYY-MM-DD的格式存储日期。
CREATE TABLE events (
event_id INT PRIMARY KEY,
event_name VARCHAR(100),
event_date DATE
);
INSERT INTO events (event_id, event_name, event_date)
VALUES (1, '公司野餐', '2023-07-15');
在这个示例中,我们创建了一个events
表并添加了一个定于2023年7月15日的公司野餐。DATE
数据类型确保我们只存储日期,不包含任何时间信息。
TIME
TIME
数据类型以HH:MI:SS的格式存储时间。
CREATE TABLE class_schedule (
class_id INT PRIMARY KEY,
class_name VARCHAR(100),
start_time TIME
);
INSERT INTO class_schedule (class_id, class_name, start_time)
VALUES (1, 'SQL入门', '09:30:00');
在这里,我们创建了一个课程表并添加了一个上午9:30开始的SQL课程。TIME
数据类型允许我们精确地存储这个时间。
DATETIME
DATETIME
数据类型结合了日期和时间,通常以YYYY-MM-DD HH:MI:SS的格式。
CREATE TABLE appointments (
appointment_id INT PRIMARY KEY,
patient_name VARCHAR(100),
appointment_datetime DATETIME
);
INSERT INTO appointments (appointment_id, patient_name, appointment_datetime)
VALUES (1, 'John Doe', '2023-06-20 14:30:00');
在这个示例中,我们为John Doe安排了一个2023年6月20日下午2:30的医生预约。DATETIME
数据类型允许我们在单个列中存储日期和时间。
TIMESTAMP
TIMESTAMP
数据类型与DATETIME
类似,但它通常用于跟踪记录最后一次修改的时间。
CREATE TABLE blog_posts (
post_id INT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
INSERT INTO blog_posts (post_id, title, content)
VALUES (1, '我的第一篇博客文章', '你好,世界!');
在这个示例中,last_updated
列在插入或更新记录时将自动设置为当前日期和时间。
SQL中的日期和时间函数
现在我们知道如何存储日期和时间了,让我们探索一些SQL提供的用于操作这些数据的神奇函数。我喜欢把这些函数想象成我们SQL工具包中的时间旅行工具!
当前日期和时间
让我们从基础开始 - 获取当前的日期和时间。
SELECT CURRENT_DATE() AS today,
CURRENT_TIME() AS current_time,
NOW() AS current_datetime;
这个查询将给你当前的日期、时间和日期时间。就像问SQL:“嘿,现在几点了?”很方便,对吧?
提取日期的一部分
有时,我们只需要日期的特定部分。SQL为此也有函数!
SELECT YEAR('2023-06-20') AS year,
MONTH('2023-06-20') AS month,
DAY('2023-06-20') AS day,
WEEKDAY('2023-06-20') AS weekday;
这个查询从给定的日期中提取年、月、日和星期几。就像解剖一个日期以获取我们需要的信息。
日期算术
SQL允许我们对日期执行算术运算。这对于计算持续时间或查找未来/过去的日期特别有用。
SELECT DATE_ADD('2023-06-20', INTERVAL 7 DAY) AS week_later,
DATE_SUB('2023-06-20', INTERVAL 1 MONTH) AS month_ago,
DATEDIFF('2023-12-31', '2023-06-20') AS days_until_new_year;
在这个示例中,我们向一个日期添加7天,从一个日期中减去1个月,并计算两个日期之间的天数。就像在我们指尖拥有一个时间机器!
格式化日期
有时,我们需要以特定的格式呈现日期。DATE_FORMAT
函数来拯救我们。
SELECT DATE_FORMAT('2023-06-20', '%W, %M %d, %Y') AS formatted_date,
DATE_FORMAT('2023-06-20 14:30:00', '%h:%i %p') AS formatted_time;
这个查询将日期格式化为"星期二,六月二十日,2023年",并将时间格式化为"02:30 PM"。就像给我们的日期穿上盛装!
以下是一些常用的格式指定符:
指定符 | 描述 | 示例 |
---|---|---|
%Y | 4位年份 | 2023 |
%y | 2位年份 | 23 |
%M | 月份名称 | 一月 |
%m | 月份(01-12) | 01 |
%d | 月份中的日(01-31) | 01 |
%W | 星期名称 | 星期一 |
%w | 星期中的日(0-6,0为星期日) | 1 |
%H | 小时(00-23) | 13 |
%h | 小时(01-12) | 01 |
%i | 分钟(00-59) | 30 |
%s | 秒(00-59) | 45 |
%p | AM或PM | PM |
把所有知识结合起来
让我们用一个更复杂的示例来结束,它结合了几个概念:
CREATE TABLE user_logins (
login_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
login_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO user_logins (user_id) VALUES (1), (2), (3);
SELECT
user_id,
login_time,
DATE_FORMAT(login_time, '%W, %M %d, %Y at %h:%i %p') AS formatted_login_time,
CASE
WHEN WEEKDAY(login_time) IN (5, 6) THEN '周末登录'
ELSE '工作日登录'
END AS login_type,
TIMESTAMPDIFF(HOUR, login_time, NOW()) AS hours_since_login
FROM user_logins
WHERE login_time > DATE_SUB(CURRENT_DATE(), INTERVAL 1 WEEK);
这个示例创建了一个user_logins
表,插入了一些数据,然后使用各种日期和时间操作进行了查询。我们格式化了登录时间,确定了它是周末还是工作日登录,并计算了自登录以来过去的小时数。
就这样,朋友们!我们用SQL穿越了时间,学习了日期和时间数据类型以及函数。记住,熟能生巧,所以不要害怕尝试这些概念。在你意识到之前,你就会在你的数据库中随心所欲地操纵时间!
Credits: Image by storyset