5.1 — 日期处理
你将学习
- 如何在SQL中筛选和格式化日期
- 常用的日期函数和比较操作
- 与Excel日期处理的比较
在SQL中处理日期
以下是示例中使用的销售数据:
Product | Amount | SaleDate |
---|---|---|
Apples | 120 | 2024-05-01 |
Apples | 90 | 2024-05-15 |
Oranges | 80 | 2024-05-03 |
Oranges | 70 | 2024-06-10 |
Bananas | 60 | 2024-05-20 |
Bananas | 50 | 2024-06-05 |
Pears | 40 | 2024-05-25 |
Pears | 30 | 2024-06-15 |
在Excel中,您可能使用筛选器或函数如YEAR()
、MONTH()
或自定义日期格式。SQL提供类似的函数,并允许您按日期范围筛选数据。
示例:筛选2024年5月的销售数据
sql
SELECT *
FROM sales
WHERE SaleDate >= Date '2024-05-01' AND SaleDate <= Date '2024-05-31';
示例:提取年份和月份
sql
SELECT SaleDate, YEAR(SaleDate) AS Sale_Year, MONTH(SaleDate) AS Sale_Month
FROM sales;
- 大多数数据库支持
Date
、YEAR()
、MONTH()
和DAY()
等函数(语法可能有所不同)
按月或年分组数据
您可按月或年分组数据进行趋势分析:
sql
SELECT YEAR(SaleDate) AS Sale_Year, MONTH(SaleDate) AS Sale_Month, SUM(Amount) AS Total_Sales
FROM sales
GROUP BY YEAR(SaleDate), MONTH(SaleDate)
ORDER BY Sale_Year, Sale_Month;
日期格式化
某些数据库允许您格式化日期显示:
sql
SELECT DATE_FORMAT(SaleDate, '%Y-%m') AS YearMonth, SUM(Amount) AS Total
FROM sales
GROUP BY YearMonth;
-- PostgreSQL/Oracle/Teradata: TO_CHAR(SaleDate, 'YYYY-MM')
-- Snowflake: TO_VARCHAR(SaleDate, 'YYYY-MM')
-- Databricks (Spark SQL): DATE_FORMAT(SaleDate, 'yyyy-MM')
(语法可能因数据库而异:请查阅数据库文档获取详细信息)
各数据库常用日期函数
目的 | PostgreSQL / Oracle / Teradata | SQL Server | Databricks (Spark SQL) | Snowflake / BigQuery | MySQL / MariaDB |
---|---|---|---|---|---|
提取年份 | EXTRACT(YEAR FROM SaleDate) 或 TO_CHAR(SaleDate, 'YYYY') | YEAR(SaleDate) | year(SaleDate) | YEAR(SaleDate) | YEAR(SaleDate) |
提取月份 | EXTRACT(MONTH FROM SaleDate) 或 TO_CHAR(SaleDate, 'MM') | MONTH(SaleDate) | month(SaleDate) | MONTH(SaleDate) | MONTH(SaleDate) |
提取日期 | EXTRACT(DAY FROM SaleDate) 或 TO_CHAR(SaleDate, 'DD') | DAY(SaleDate) | day(SaleDate) | DAY(SaleDate) | DAY(SaleDate) |
格式化为YYYY-MM | TO_CHAR(SaleDate, 'YYYY-MM') | FORMAT(SaleDate, 'yyyy-MM') | date_format(SaleDate, 'yyyy-MM') | TO_VARCHAR(SaleDate, 'YYYY-MM') | DATE_FORMAT(SaleDate, '%Y-%m') |
添加天数 | SaleDate + n (天) 或 ADD_DAYS(SaleDate, n) | DATEADD(day, n, SaleDate) | date_add(SaleDate, n) | DATEADD(day, n, SaleDate) | DATE_ADD(SaleDate, INTERVAL n DAY) |
当前日期 | CURRENT_DATE | GETDATE() | current_date() | CURRENT_DATE() | CURDATE() |
注意:语法可能因数据库版本而异。请务必查阅数据库文档获取详细信息。
计算两个日期之间的天数
您可以使用内置函数计算两个日期之间的天数差。这类似于Excel中的日期相减。
示例:
数据库 | 语法示例 |
---|---|
PostgreSQL / Oracle / Teradata | SELECT EndDate - StartDate AS Days_Diff FROM sales; |
SQL Server | SELECT DATEDIFF(day, StartDate, EndDate) AS Days_Diff FROM sales; |
Databricks (Spark SQL) | SELECT datediff(EndDate, StartDate) AS Days_Diff FROM sales; |
Snowflake / BigQuery | SELECT DATEDIFF(day, StartDate, EndDate) AS Days_Diff FROM sales; |
MySQL / MariaDB | SELECT DATEDIFF(EndDate, StartDate) AS Days_Diff FROM sales; |
- 将
StartDate
和EndDate
替换为实际的列名 - 结果为两个日期之间的天数
注意:某些数据库中参数的顺序可能不同。请务必查阅数据库文档获取详细信息。
关键要点
- SQL可以像Excel一样筛选、提取和按日期分组数据
- 日期函数和格式可能因数据库而异
下一步
接下来,您将学习如何处理数据中的缺失值(NULL
)。