关系型数据库日期处理函数讲解

发布于:2024-10-08 ⋅ 阅读:(9) ⋅ 点赞:(0)

在 MySQL、Oracle 和 SQL Server 中,日期处理函数是很常用的功能,用于处理和操作日期时间数据。但三个数据库中的相关语句又有差别,因此整理了一下个人开发中常用的有关日期时间的函数或解决思路,仅供参考!

一、获取当前日期和时间

1. MySQL

  • 函数NOW()

  • 案例:

    SELECT NOW(); -- 获取当前日期和时间
    

2. Oracle

  • 函数SYSDATE

  • 案例:

    SELECT SYSDATE FROM dual; -- 获取当前日期和时间
    

3. SQL Server

  • 函数GETDATE()

  • 案例:

    SELECT GETDATE(); -- 获取当前日期和时间
    

二、提取日期的各部分信息

1. MySQL

  • 函数YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND()

  • 案例:

    SELECT YEAR(NOW()), MONTH(NOW()), DAY(NOW()), HOUR(NOW()), MINUTE(NOW()), SECOND(NOW());
    -- 提取当前日期的年、月、日、小时、分钟和秒
    

2. Oracle

  • 函数EXTRACT()

  • 案例:

    SELECT EXTRACT(YEAR FROM SYSDATE), EXTRACT(MONTH FROM SYSDATE), EXTRACT(DAY FROM SYSDATE) FROM dual;
    -- 提取当前日期的年、月、日
    

3. SQL Server

  • 函数YEAR(), MONTH(), DAY()

  • 案例:

    SELECT YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE());
    -- 提取当前日期的年、月、日
    

三、日期加减操作

1. MySQL

  • 函数DATE_ADD(), DATE_SUB()

  • 案例:

    SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); -- 日期加一天
    SELECT DATE_SUB(NOW(), INTERVAL 1 DAY); -- 日期减一天
    

2. Oracle

  • 函数SYSDATE + n(天数加减)

  • 案例:

    sql复制代码SELECT SYSDATE + 1 FROM dual; -- 日期加一天
    SELECT SYSDATE - 1 FROM dual; -- 日期减一天
    

3. SQL Server

  • 函数DATEADD()

  • 案例:

    SELECT DATEADD(DAY, 1, GETDATE()); -- 日期加一天
    SELECT DATEADD(DAY, -1, GETDATE()); -- 日期减一天
    

四、日期差值计算

1. MySQL

  • 函数DATEDIFF()

  • 案例:

    SELECT DATEDIFF('2024-12-31', NOW()); -- 计算当前日期到2024-12-31的天数差
    

2. Oracle

  • 函数:日期相减

  • 案例:

    SELECT SYSDATE - TO_DATE('2024-12-31', 'YYYY-MM-DD') FROM dual; -- 计算日期差
    

3. SQL Server

  • 函数DATEDIFF()

  • 案例:

    SELECT DATEDIFF(DAY, GETDATE(), '2024-12-31'); -- 计算当前日期到2024-12-31的天数差
    

五、日期格式化

1. MySQL

  • 函数DATE_FORMAT()

  • 案例:

    SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 格式化日期为指定格式
    

2. Oracle

  • 函数TO_CHAR()

  • 案例:

    SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual; -- 格式化日期为指定格式
    

3. SQL Server

  • 函数FORMAT()

  • 案例:

    SELECT FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss'); -- 格式化日期为指定格式
    

六、日期字符串转换为日期类型

1. MySQL

  • 函数STR_TO_DATE()

  • 案例:

    SELECT STR_TO_DATE('2024-12-31', '%Y-%m-%d'); -- 将字符串转换为日期
    

2. Oracle

  • 函数TO_DATE()

  • 案例:

    SELECT TO_DATE('2024-12-31', 'YYYY-MM-DD') FROM dual; -- 将字符串转换为日期
    

3. SQL Server

  • 函数CAST()CONVERT()

  • 案例:

    SELECT CAST('2024-12-31' AS DATE); -- 将字符串转换为日期
    SELECT CONVERT(DATE, '2024-12-31', 120); -- 将字符串转换为日期
    

七、获取日期的星期信息

1. MySQL

  • 函数DAYOFWEEK(), WEEKDAY(), WEEK()

  • 案例:

    SELECT DAYOFWEEK(NOW()); -- 获取当前日期是星期几,返回1(周日)到7(周六)
    SELECT WEEKDAY(NOW()); -- 获取当前日期是星期几,返回0(周一)到6(周日)
    SELECT WEEK(NOW()); -- 获取当前日期是当前年的第几周
    

2. Oracle

  • 函数TO_CHAR()

  • 案例:

    SELECT TO_CHAR(SYSDATE, 'D') FROM dual; -- 获取当前日期是星期几,返回1(周日)到7(周六)
    SELECT TO_CHAR(SYSDATE, 'IW') FROM dual; -- 获取当前日期是ISO标准下的第几周
    

3. SQL Server

  • 函数DATENAME(), DATEPART()

  • 案例:

    SELECT DATENAME(WEEKDAY, GETDATE()); -- 获取当前日期的星期名称
    SELECT DATEPART(WEEK, GETDATE()); -- 获取当前日期是当前年的第几周
    

八、设置特定的日期和时间

1. MySQL

  • 函数MAKEDATE(), MAKETIME()

  • 案例:

    SELECT MAKEDATE(2024, 150); -- 根据年份和天数生成日期,2024年第150天
    SELECT MAKETIME(12, 30, 45); -- 创建时间为12:30:45
    

2. Oracle

  • 函数TO_DATE(), TO_TIMESTAMP()

  • 案例:

    SELECT TO_DATE('2024-12-31', 'YYYY-MM-DD') FROM dual; -- 创建一个特定的日期
    SELECT TO_TIMESTAMP('2024-12-31 12:30:45', 'YYYY-MM-DD HH24:MI:SS') FROM dual; -- 创建一个特定的时间戳
    

3. SQL Server

  • 函数DATETIMEFROMPARTS(), TIMEFROMPARTS()

  • 案例:

    SELECT DATETIMEFROMPARTS(2024, 12, 31, 12, 30, 45, 0); -- 创建一个特定的日期时间
    SELECT TIMEFROMPARTS(12, 30, 45, 0); -- 创建一个特定的时间
    

九、获取日期中的季度信息

1. MySQL

  • 函数QUARTER()

  • 案例:

    SELECT QUARTER(NOW()); -- 获取当前日期是第几季度
    

2. Oracle

  • 函数EXTRACT()

  • 案例:

    SELECT EXTRACT(QUARTER FROM SYSDATE) FROM dual; -- 获取当前日期是第几季度
    

3. SQL Server

  • 函数DATEPART()

  • 案例:

    SELECT DATEPART(QUARTER, GETDATE()); -- 获取当前日期是第几季度
    

十、获取月份的天数

MySQL和Oracle在网上有建议使用LAST_DAY()函数的,但是我用的库一直报错(猜测可能是版本原因),这里提供一个个人常用的思路,仅供参考:查询当月下个月第一天的日期,然后查询该日期前一天的日期。

1. MySQL

SELECT 
DATE_SUB(
    DATE_ADD(CURDATE(), INTERVAL 1 MONTH), INTERVAL DAY(CURDATE()) DAY
    ) AS last_day_of_month;

解释:

  • CURDATE():返回当前的日期。
  • DATE_ADD(CURDATE(), INTERVAL 1 MONTH):获取下个月的同一天。
  • DAY(CURDATE()):获取当前日期的天数。
  • DATE_SUB(..., INTERVAL DAY(CURDATE()) DAY):从下个月的同一天减去当前天数,得到当月的最后一天。

示例:

假设今天是 2024-10-08,查询结果将是:

2024-10-31

2. Oracle

SELECT TRUNC(ADD_MONTHS(SYSDATE, 1), 'MM') - 1 AS last_day_of_month
FROM dual;

解释:

  • SYSDATE:获取当前日期和时间。
  • ADD_MONTHS(SYSDATE, 1):获取下个月的同一天。
  • TRUNC(ADD_MONTHS(SYSDATE, 1), 'MM'):将下个月的日期截取为月初(即下个月的第一天)。
  • - 1:从下个月的第一天减去一天,得到当月的最后一天。

示例:

假设今天是 2024-10-08,查询结果将是:

2024-10-31

3. SQL Server

SELECT EOMONTH(GETDATE()) AS last_day_of_month;

解释:

  • GETDATE():获取当前日期和时间。
  • EOMONTH(GETDATE()):获取当前月份的最后一天。

示例:

假设今天是 2024-10-08,查询结果将是:

2024-10-31

十一、日期与时间戳的转换

1. MySQL

  • 函数UNIX_TIMESTAMP(), FROM_UNIXTIME()

  • 案例:

    SELECT UNIX_TIMESTAMP(NOW()); -- 将当前时间转换为UNIX时间戳
    SELECT FROM_UNIXTIME(1672531199); -- 将UNIX时间戳转换为日期时间
    

2. Oracle

  • 函数CURRENT_TIMESTAMP, TIMESTAMP

  • 案例:

    SELECT CURRENT_TIMESTAMP FROM dual; -- 获取当前时间戳
    SELECT TO_TIMESTAMP('2024-12-31 12:30:45', 'YYYY-MM-DD HH24:MI:SS') FROM dual; -- 将字符串转换为时间戳
    

3. SQL Server

  • 函数GETUTCDATE(), SWITCHOFFSET()

  • 案例:

    SELECT GETUTCDATE(); -- 获取当前UTC时间
    SELECT SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'); -- 将UTC时间偏移为特定时区的时间
    

十二、查询不同日期固定时间

在开发中可能会遇到查询不同日期固定时间的情况,例如查询当天的08:00:00的情况,下面通过一些例子记录个人解决的思路

1. MySQL

SELECT DATE_FORMAT(CURDATE(), '%Y-%m-%d 08:00:00');

2. Oracle

SELECT TO_CHAR(TRUNC(SYSDATE), 'YYYY-MM-DD') || ' 08:00:00' FROM dual;

3. SQL Server

SELECT CONVERT(VARCHAR, GETDATE(), 23) + ' 08:00:00';

十三、其他日期函数

1. MySQL

  • 函数ADDDATE(), SUBDATE()

  • 案例:

    SELECT ADDDATE(NOW(), INTERVAL 5 DAY); -- 在当前日期加上5天
    SELECT SUBDATE(NOW(), INTERVAL 5 DAY); -- 从当前日期减去5天
    

2. Oracle

  • 函数ADD_MONTHS(), NEXT_DAY()

  • 案例:

    SELECT ADD_MONTHS(SYSDATE, 2) FROM dual; -- 在当前日期加上2个月
    SELECT NEXT_DAY(SYSDATE, 'MONDAY') FROM dual; -- 获取当前日期之后的下一个星期一
    

3. SQL Server

  • 函数EOMONTH(), SYSDATETIME()

  • 案例:

    SELECT EOMONTH(GETDATE()); -- 获取当前月的最后一天
    SELECT SYSDATETIME(); -- 获取当前系统的日期和时间