跳至内容
SQL
数据分析

精通 SQL 日期比较:如何查询晚于特定日期的记录

学习如何在 SQL 中查询并筛选晚于特定日期的记录。比较在 MySQL、PostgreSQL 和 SQL Server 中“日期大于”的差异。
Allan Ouko's photo
Allan Ouko
已更新 · 11分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。

掌握如何查询晚于特定日期的记录,对于高效的数据库管理与分析至关重要。本教程将全面介绍在不同 SQL 数据库系统(包括 SQL Server、PostgreSQL 和 Oracle)中执行日期比较的方法。无论是进行历史数据分析、报表制作,还是记录筛选,熟悉这一技巧都将提升您的 SQL 查询能力。

阅读完本指南,您将能够:

  • 理解 不同 SQL 数据库(包括 SQL Server、PostgreSQL 和 Oracle)中的日期格式和日期函数细微差异。
  • 应用 贴近实务的示例于真实场景。

如果您是一名数据分析师或数据科学家,准备进一步学习,建议先学习 DataCamp 的 SQL Fundamentals 技能路径,熟悉从数据库查询数据。若您希望拓展数据库方面的专业能力,可查看 Database Design 课程,了解如何构建高效的数据库。

SQL 日期比较简介

日期比较在 SQL 中十分重要,它使数据从业者能够在分析过程中对数据进行筛选与排序。该方法在需要趋势分析的财务报表和库存管理中尤为实用。

SQL 的“大于”运算符(>)可与日期共同使用,用于比较两个日期值。当您在包含日期的 SQL 查询中使用“大于”运算符时,查询将返回日期晚于指定日期的记录。例如,下面的查询将返回 Orders 表中 OrderDate 晚于 2023-01-01 的行。

SELECT *
FROM Orders
WHERE OrderDate > '2023-01-01';

我们先快速回顾可用于筛选数据的基本 SQL 运算符。这些运算符也收录在我们的 SQL Basics Cheat Sheet 中,建议在尝试下文示例前先行查看。

等于(=)

= 运算符用于判断两个值是否相等。下面的示例展示了该运算符与日期值的用法。该 SQL 查询将返回 Orders 表中 OrderDate 等于 2023-01-01 的行。

-- Select all orders placed on January 1, 2023
SELECT *
FROM Orders
WHERE OrderDate = '2023-01-01';

不等于(!= 或 <>)

!= 或 <> 运算符用于返回与被比较值不同的记录。例如,与日期值一起使用时,!= 或 <> 将返回不等于指定日期的行。您也可以阅读我们的 SQL NOT EQUAL Operator: A Beginner's Guide 教程,了解更多细节。

-- Select all orders that were not placed on January 1, 2023
SELECT *
FROM Orders
WHERE OrderDate != '2023-01-01';
-- Alternative syntax using <>
SELECT *
FROM Orders
WHERE OrderDate <> '2023-01-01';

小于(<)

< 运算符用于判断左侧值是否小于右侧值。当在包含日期值的 SQL 查询中使用时,将返回早于指定日期的记录。例如,下面的查询将返回 Orders 表中 OrderDate 早于 2023-01-01 的行。

-- Select all orders placed before January 1, 2023
SELECT *
FROM Orders
WHERE OrderDate < '2023-01-01';

大于或等于(>=)

>= 运算符用于判断左侧值是否大于或等于右侧值。在 SQL 中用于查询日期时,它将返回日期值等于或晚于被比较值的记录。

-- Select all orders placed on or after January 1, 2023
SELECT *
FROM Orders
WHERE OrderDate >= '2023-01-01';

小于或等于(<=)

<= 运算符用于判断左侧值是否小于或等于右侧值。在用于查询日期值时,它将返回日期值等于或早于被比较值的记录。

-- Select all orders placed on or before January 1, 2023
SELECT *
FROM Orders
WHERE OrderDate <= '2023-01-01';

在 SQL Server 中进行日期比较

在 SQL Server 中,我们可以使用以下运算符比较日期:<、<=、>、>= 和 =。下面重点介绍:

使用“大于”(>)运算符

在 SQL Server 中,“大于”(>)运算符用于筛选晚于其右侧比较日期的记录。例如,下面的查询会筛选 Orders 表,并返回 OrderDate 晚于 2023-01-01 的订单记录。

-- Select all orders delivered after January 1, 2023
SELECT *
FROM Orders
WHERE DeliveryDate > '2023-01-01';

使用 GETDATE() 函数

SQL Server 中的 GETDATE() 函数返回用户系统记录的当前日期。因此,您可以使用该函数查询数据,并筛选出日期晚于当前日期的行。

-- Select all orders delivered after the current date and time
SELECT *
FROM Orders
WHERE DeliveryDate > GETDATE();

使用 BETWEEN 进行日期范围筛选

SQL 中的 BETWEEN 运算符用于筛选位于给定范围内的值。在 SQL Server 中与日期配合使用时,您可以筛选处于指定日期区间内的行。结果将包含查询中写明的起止日期。

-- Select all orders delivered between January 1, 2023, and December 31, 2023
SELECT *
FROM Orders
WHERE DeliveryDate BETWEEN '2023-01-01' AND '2023-12-31';

使用 CAST 和 CONVERT 处理日期

您也可以使用 CAST 与 CONVERT 函数来避免错误。这些函数可确保日期值被正确解析并按期望格式化。

-- Convert a string to a date
SELECT CAST('2023-06-26' AS DATE) AS ConvertedDate;

-- Convert a string to a datetime
SELECT CAST('2023-06-26 14:30:00' AS DATETIME) AS ConvertedDateTime;
-- Convert a string to a date using CONVERT
SELECT CONVERT(DATE, '2023-06-26') AS ConvertedDate;

-- Convert a string to a datetime using CONVERT
SELECT CONVERT(DATETIME, '2023-06-26 14:30:00') AS ConvertedDateTime;

在 PostgreSQL 中进行日期比较

PostgreSQL 提供了一些用于日期比较的不同子句。我们在下文进行说明。

使用“大于”(>)运算符

与 SQL Server 类似,PostgreSQL 中的 > 运算符会筛选出晚于比较日期的记录。

-- Select all orders placed after January 1, 2023
SELECT *
FROM Orders
WHERE OrderDate > '2023-01-01';

使用 EXTRACT 函数

在 PostgreSQL 中,EXTRACT 函数用于提取日期字段,如年、月或日。下面的查询中,EXTRACT 子句筛选出年份为 2023 的记录。

-- Select all orders placed in the year 2023
SELECT *
FROM Orders
WHERE EXTRACT(YEAR FROM OrderDate) = 2023;

使用 INTERVAL

INTERVAL 在 PostgreSQL 中用于进行日期运算。它允许您在某个日期上加减特定的时间长度。

-- Select all orders placed in the last 30 days
SELECT *
FROM Orders
-- Filter orders placed within the last 30 days from the current date
WHERE OrderDate > NOW() - INTERVAL '30 days';

使用 DATE_PART 函数

DATE_PART 函数允许从日期值中提取子字段,既可以是日期也可以是时间。下面的查询返回三月下单的订单,其中第三个月以双精度值 3 表示。

-- Select all orders placed in March
SELECT *
FROM Orders
WHERE DATE_PART('month', OrderDate) = 3;

使用 TO_DATE 函数

PostgreSQL 中的 TO_DATE 会按照指定格式将字符串转换为日期值。下面的查询中,日期以字符串提供,因此需按 YYYY-MM-DD 格式转换为日期。

-- Select all orders placed on January 1, 2023, using a string date
SELECT *
FROM Orders
WHERE OrderDate = TO_DATE('2023-01-01', 'YYYY-MM-DD');

使用 BETWEEN 进行日期范围筛选

与 SQL Server 一样,PostgreSQL 的 BETWEEN 子句用于筛选处于特定范围内的数据。对于日期值,BETWEEN 会筛选并返回位于指定日期之间的行,且包含边界日期。

-- Select all orders placed between January 1, 2023, and December 31, 2023
SELECT *
FROM Orders
WHERE OrderDate BETWEEN '2023-01-01' AND '2023-12-31';

在 Oracle 中进行日期比较

使用“大于”(>)运算符

> 运算符用于筛选晚于比较日期的记录。

-- Select all active users with an end date in the future
SELECT *
FROM Users
-- Filter users with status 'Active'
WHERE Status = 'Active'
  -- Ensure the end date is in the future
  AND EndDate > SYSDATE;

处理 NULL 日期与复杂条件

在 Oracle 数据库中比较日期时,务必考虑复杂场景,如空日期。此时可使用 IS NULL 子句筛选没有日期的记录。

-- Select all active users with either a future end date or no end date (NULL)
SELECT *
FROM Users
-- Filter users with status 'Active'
WHERE Status = 'Active'
  -- Ensure the end date is either in the future or is NULL (no end date)
  AND (EndDate > SYSDATE OR EndDate IS NULL);

使用 BETWEEN 进行日期范围筛选

Oracle 中也可使用 BETWEEN 子句筛选处于特定范围内的数据。对于包含日期的值,BETWEEN 会筛选并返回位于指定日期之间的记录,且同样包含边界日期。

-- Select all active users with an end date between the current date and a specified future date (e.g., end of the year)
SELECT *
FROM Users
-- Filter users with status 'Active'
WHERE Status = 'Active'
  -- Ensure the end date is between the current date and a specified future date (e.g., December 31, 2023)
  AND EndDate BETWEEN SYSDATE AND DATE '2023-12-31';

常见陷阱与最佳实践

我在使用 SQL 的“大于”与日期时遇到过一些问题。以下是常见错误及其规避建议。

日期格式不一致

在查询中使用不一致的日期格式会导致错误。例如,将 YYYY-MM-DD 与 MM-DD-YYYY 混用,可能无法得到期望结果。

为避免问题,请始终使用标准化的日期格式。您也可以在 PostgreSQL 或 Oracle 中使用 TO_DATE 将日期转换为所需格式或本地习惯;在 SQL Server 中可使用 CAST 与 CONVERT 函数。

-- Convert a string to a date
SELECT CAST('2023-06-26' AS DATE) AS ConvertedDate;

-- Convert a string to a datetime
SELECT CAST('2023-06-26 14:30:00' AS DATETIME) AS ConvertedDateTime;
-- Convert a string to a date using CONVERT
SELECT CONVERT(DATE, '2023-06-26') AS ConvertedDate;

-- Convert a string to a datetime using CONVERT
SELECT CONVERT(DATETIME, '2023-06-26 14:30:00') AS ConvertedDateTime;

时区处理

在跨多个时区处理数据时,您可能会得到不准确的结果。此外,在日期转换时未考虑时区差异也可能引发错误。

因此,建议将日期存储为 UTC(协调世界时),并在比较时使用内置的时区函数进行转换。

-- Store dates in UTC and convert to local time zone
SELECT *
FROM Orders
-- Filter orders where the OrderDate in UTC is greater than the current date in the 'America/New_York' time zone
WHERE OrderDate AT TIME ZONE 'UTC' > SYSDATE AT TIME ZONE 'America/New_York';
-- Use time zone functions for accurate comparison
SELECT *
FROM Users
-- Filter users where the EndDate in UTC is greater than the current date in UTC
WHERE EndDate AT TIME ZONE 'UTC' > SYSDATE AT TIME ZONE 'UTC';

避免日期相关的常见错误

处理日期时,应尽量避免不必要的错误,仅检索分析所需的字段。例如,如果时间部分与分析无关,可以省略时间分量。对 NULL 值进行显式处理,尤其在日期字段可能为空时,以防止错误。

编写可读、易维护的查询

过于复杂、嵌套层级过深的查询会降低可读性,也不利于理解各子句的作用。同样,如果未在代码中添加注释,也难以解释其逻辑。

因此,建议为关键子句添加注释说明其逻辑。为提升可读性,您也可以使用简单的子查询或公共表表达式(CTE)。想要进一步学习如何为分析与报表编写可读、易维护的查询,请查看我们的 Reporting in SQL 课程。

关于 SQL 方法差异的说明

不同数据库系统(如 SQL Server、PostgreSQL 和 Oracle)在日期比较方法上的多样性,源于各自独立的演进历程与设计理念。每套系统面向的用户需求与兼容性要求不同,因而在遵循 SQL 标准的同时,也引入了各自的专有特性与实现方式。

例如:

  • SQL Server 由微软开发,许多函数与语法倾向与其他微软产品保持一致,旨在促进集成并提升在 Windows 生态中的易用性。
  • PostgreSQL 是强调可扩展性的开源项目。这种灵活性鼓励了多样化的日期函数与运算符,并可由社区进行优化或扩展。
  • Oracle 通常聚焦于企业级应用的高可扩展性与高可靠性,因此在日期及其他数据类型的处理上进行了特定优化,更适用于复杂、高并发的事务场景。

结语

建议您多加练习,以便在真实场景中熟练运用各类 SQL 函数。可以学习 DataCamp 的 SQL Fundamentals 与 Intermediate SQL 课程。对于立志成为数据分析师或数据科学家的读者,也推荐 Associate Data Analyst in SQL 课程,帮助您掌握多种分析技巧。这些课程也有助于您备考 SQL Associate Certification,为简历加分。


Allan Ouko's photo
Author
Allan Ouko
LinkedIn

数据科学技术写作者,具备数据分析、商业智能和数据科学的一线实践经验。我撰写以行业为导向的实用内容,涵盖 SQL、Python、Power BI、Databricks 和数据工程,并以真实的分析工作为基础。我的写作兼顾技术深度与业务影响,帮助专业人士将数据转化为自信的决策。

常见问题解答

什么是比较运算符?

比较运算符用于比较两个值,并根据比较结果返回真或假的判断。

在 SQL 日期值中常用哪些运算符?

在 SQL 日期值中常用的运算符包括 等于(=)、大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)。

何时在 SQL 中使用 BETWEEN 运算符?

当需要筛选处于某个范围内的记录时,可使用 BETWEEN 运算符。

如果日期列存在 NULL 值,应使用什么运算符?

若日期包含空值,应使用 IS NULL 子句来处理 NULL,避免查询结果出错。

在按日期筛选时,如果 SQL 查询报错,我该怎么办?

请检查日期是否使用了正确格式;如未统一,先将其转换为一致的格式,例如 YYYY-MM-DD。

主题
SQL
数据分析

与 DataCamp 一起学习 SQL

课程

SQL 入门

2 小时
1.6M
两小时学会用 SQL 创建和查询关系型数据库。
查看详情开始课程

课程

SQL 中级

4 小时
529.3K
在每一步都有实践查询陪伴,这门课程教你立即用自己的 SQL 代码分析数据所需的一切!

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。
查看更多