LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

PostgreSQL 中 NOW() 和 CURRENT_DATE 的用法区别

maoxiaoming
2025年8月21日 8:51 本文热度 74
主要区别
特性NOW()CURRENT_DATE
返回值带时区的时间戳日期(无时间)
数据类型TIMESTAMP WITH TIME ZONEDATE
包含时间是(时分秒毫秒)
使用时区
典型用途需要精确时间戳的场景只需要日期的场景

具体例子说明

1. 基本用法

sql
-- NOW() 返回完整的时间戳
SELECT NOW();  -- 2025-08-06 15:41:48.123456+08
-- CURRENT_DATE 只返回日期
SELECT CURRENT_DATE;  -- 2025-08-06
-- CURRENT_DATE 相当于 NOW()::date
SELECT NOW()::date;  -- 2025-08-06

2. 在查询中的使用场景

sql
-- 场景1:记录操作时间(需要精确时间)
INSERT INTO user_logs (user_id, action, created_at)
VALUES (1, 'login', NOW());  -- 记录精确到毫秒的登录时间
-- 场景2:按日期查询(只需要日期)
SELECT * FROM orders 
WHERE order_date = CURRENT_DATE;  -- 查找今天的订单
-- 错误用法:用NOW()进行日期比较
SELECT * FROM orders 
WHERE order_date = NOW();  -- 这几乎不会匹配,因为NOW()包含时间

3. 日期计算的区别

sql
-- 使用CURRENT_DATE进行日期计算(推荐)
SELECT CURRENT_DATE + INTERVAL '1 day';  -- 明天
SELECT CURRENT_DATE - 7;  -- 7天前
-- 使用NOW()进行日期计算(也可以,但需要转换)
SELECT (NOW() + INTERVAL '1 day')::date;  -- 需要转换类型
SELECT (NOW()::date - 7);  -- 需要先转换为日期

4. 时间间隔计算

sql
-- 计算两个日期之间的天数差(使用CURRENT_DATE)
SELECT CURRENT_DATE - '2025-01-01'::date;  -- 返回218(天数)
-- 计算时间间隔(使用NOW())
SELECT NOW() - '2025-08-06 10:00:00'::timestamp;  -- 返回05:41:48.123456
-- 天数计算示例
SELECT id FROM mis_white_list 
WHERE (CURRENT_DATE - input_time::date) <= valid_days;  -- 正确的天数比较

5. 在条件判断中的使用

sql
-- 检查是否在某个时间范围内(使用NOW())
SELECT * FROM events 
WHERE start_time <= NOW() AND end_time >= NOW();
-- 检查是否是今天(使用CURRENT_DATE)
SELECT * FROM appointments 
WHERE appointment_date = CURRENT_DATE;
-- 检查是否在过去7天内
SELECT * FROM notifications 
WHERE created_at::date >= CURRENT_DATE - 7;

6. 性能考虑

sql
-- CURRENT_DATE 通常更快,因为不涉及时间计算
EXPLAIN ANALYZE SELECT * FROM sales WHERE sale_date = CURRENT_DATE;
-- NOW() 在需要转换为日期时会有额外开销
EXPLAIN ANALYZE SELECT * FROM sales WHERE sale_date = NOW()::date;

最佳实践建议

  1. 使用 CURRENT_DATE 当:

    • 只需要日期部分

    • 进行日期比较和计算

    • 按天进行统计和分组

  2. 使用 NOW() 当:

    • 需要精确的时间戳

    • 记录操作的具体时间

    • 计算时间间隔(包含时分秒)

  3. 在具体案例中

sql
-- 正确:使用CURRENT_DATE进行天数计算
SELECT id FROM mis_white_list 
WHERE (CURRENT_DATE - input_time::date) <= valid_days;
-- 也可以但不够优雅:使用NOW()
SELECT id FROM mis_white_list 
WHERE (NOW()::date - input_time::date) <= valid_days;

总结CURRENT_DATE 更适合纯粹的日期操作,而 NOW() 适合需要时间精度的场景。在天数计算用例中,CURRENT_DATE 是更合适的选择。


该文章在 2025/8/21 9:03:40 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved