{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2025-04-28 21:54:04","updateBy":"admin","updateTime":"2025-04-28 21:54:04","remark":null,"id":109,"articleTitle":"MySQL（十七）SQL语句日期格式化","articleUrl":"mysql_dateformat","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/9e192744fab244d39d3b15fca035c9f7.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"0","articleSummary":"无论是 MySQL 还是 Oracle，理解如何正确地格式化和处理日期时间数据都是开发高效、可靠应用程序的关键。每种数据库系统都提供了强大的工具来帮助开发者管理这些复杂性，通过合理利用这些工具，可以确保数据的一致性和准确性。","articleContent":"无论是 MySQL 还是 Oracle，理解如何正确地格式化和处理日期时间数据都是开发高效、可靠应用程序的关键。每种数据库系统都提供了强大的工具来帮助开发者管理这些复杂性，通过合理利用这些工具，可以确保数据的一致性和准确性。同时，在选择 `DATETIME` 或 `TIMESTAMP` 时，应根据具体需求考虑精度、范围及是否需要时区支持等因素。本文将分为两部分介绍 MySQL 和 Oracle 数据库中如何使用日期格式化函数，并探讨 `DATETIME` 和 `TIMESTAMP` 格式之间的区别。\n\n## MySQL 中的日期格式化\n\n### 1. 基本介绍\n\nMySQL 提供了多种函数来处理日期和时间数据，包括格式化、计算以及转换。其中最常用的两个数据类型是 `DATETIME` 和 `TIMESTAMP`。\n\n- **`DATETIME`**: 存储年、月、日、小时、分钟和秒，范围从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。\n- **`TIMESTAMP`**: 类似于 `DATETIME`，但存储的是自 1970 年以来的秒数（UNIX 时间戳），并且有更严格的范围限制（默认情况下为 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC）。\n\n### 2. 日期格式化函数\n\n#### a. `DATE_FORMAT()`\n\n用于按照指定格式返回日期值。\n\n```sql\nSELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_date;\n\nSELECT * FROM article WHERE DATE_FORMAT(create_time,'%Y-%m-%d') >= '2024-01-01';\n-- 上面的语句虽然可以工作，但并不是最高效的方式，因为它会将 create_time 列中的每一个值都转换为字符串再进行比较，这可能会影响性能，尤其是在处理大量数据时。更推荐下面直接比较的方式\nSELECT * FROM article WHERE create_time >= '2024-01-01';\n```\n\n常用格式符：\n\n- `%Y`: 四位数的年份 (e.g., 2025)\n- `%m`: 两位数的月份 (01..12)\n- `%d`: 两位数的日 (00..31)\n- `%H`: 小时 (00..23)\n- `%i`: 分钟 (00..59)\n- `%s`: 秒 (00..59)\n\n#### b. `STR_TO_DATE()`\n\n将字符串转换为日期。\n\n```sql\nSELECT STR_TO_DATE('2025-06-03', '%Y-%m-%d') AS parsed_date;\n```\n\n#### c. 转换 `DATETIME` 和 `TIMESTAMP`\n\n虽然两者都可以表示相同的日期和时间信息，但在某些情况下可能需要相互转换：\n\n```sql\n-- 将 DATETIME 转换为 TIMESTAMP\nSELECT UNIX_TIMESTAMP(datetime_column) FROM your_table;\n\n-- 将 TIMESTAMP 转换为 DATETIME\nSELECT FROM_UNIXTIME(timestamp_column) FROM your_table;\n```\n\n注意：由于 `TIMESTAMP` 的范围限制，超出该范围的操作可能会失败。\n\n## Oracle 中的日期格式化\n\n### 1. 基本介绍\n\nOracle 数据库同样支持丰富的日期和时间处理功能。Oracle 使用 `DATE` 类型来存储日期和时间，而 `TIMESTAMP` 则提供了更高的精度。\n\n- **`DATE`**: 包含世纪、年、月、日、小时、分钟和秒。\n- **`TIMESTAMP`**: 类似于 `DATE`，但可以包含小数秒（精度可达纳秒级别）。\n\n### 2. 日期格式化函数\n\n#### a. `TO_CHAR()`\n\n用于将日期转换为特定格式的字符串。\n\n```sql\nSELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS formatted_date FROM dual;\n\nSELECT * FROM article WHERE TO_CHAR(create_time,'%Y-%m-%d') >= '2024-01-01';\n```\n\n常用格式模型：\n\n- `YYYY`: 四位数的年份\n- `MM`: 月份 (01..12)\n- `DD`: 日 (01..31)\n- `HH24`: 小时 (00..23)\n- `MI`: 分钟 (00..59)\n- `SS`: 秒 (00..59)\n\n#### b. `TO_DATE()`\n\n将字符串转换为日期。\n\n```sql\nSELECT TO_DATE('2025-06-03', 'YYYY-MM-DD') AS parsed_date FROM dual;\n\nSELECT * FROM article WHERE create_time >= TO_DATE('2024-01-01', 'YYYY-MM-DD');\n```\n\n#### c. 转换 `DATE` 和 `TIMESTAMP`\n\nOracle 提供了 `CAST()` 函数来进行类型转换。\n\n```sql\n-- 将 DATE 转换为 TIMESTAMP\nSELECT CAST(date_column AS TIMESTAMP) FROM your_table;\n\n-- 将 TIMESTAMP 转换为 DATE\nSELECT CAST(timestamp_column AS DATE) FROM your_table;\n```\n\n### 3. `DATETIME` vs `TIMESTAMP` 在 Oracle 中的区别\n\n- **精度**：`TIMESTAMP` 可以存储微秒或纳秒级别的精度，而 `DATE` 仅精确到秒。\n- **范围**：`DATE` 和 `TIMESTAMP` 都能表示非常广泛的时间范围，但是 `TIMESTAMP WITH TIME ZONE` 还可以存储时区信息，这对于全球化应用非常重要。","categoryId":4,"viewCount":164,"categoryName":"MySQL","author":"球接子","authorAvatar":null,"tagIds":[2,17],"tagNames":["MySQL","数据库"]}}