当前位置:  首页>> 技术小册>> MySQL从入门到精通(三)

10.4.3 NOW() 当前日期和时间函数

在MySQL数据库中,NOW()函数是一个极其重要且常用的函数,它用于返回当前的日期和时间值。这个函数在多种场景下都非常有用,比如记录数据插入或更新的时间戳、生成报告时的当前时间显示等。NOW()函数返回的格式通常是'YYYY-MM-DD HH:MM:SS',即年-月-日 时:分:秒,这符合ISO 8601标准,易于理解和处理。

1. NOW()函数的基本用法

NOW()函数不需要任何参数,直接调用即可返回当前的日期和时间。其基本语法如下:

  1. SELECT NOW();

执行这条SQL语句后,MySQL会返回执行时的确切日期和时间。

2. NOW()函数的应用场景

2.1 记录数据插入时间

在数据表中,经常需要记录数据的创建时间或更新时间。通过在表设计时加入一个DATETIMETIMESTAMP类型的字段,并在插入数据时使用NOW()函数自动填充该字段,可以非常方便地实现这一需求。

  1. CREATE TABLE example (
  2. id INT AUTO_INCREMENT PRIMARY KEY,
  3. data VARCHAR(255),
  4. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  5. );
  6. -- 插入数据时,created_at字段会自动设置为当前时间
  7. INSERT INTO example (data) VALUES ('Some data');

注意:在上面的例子中,虽然NOW()函数没有直接用于INSERT语句中,但TIMESTAMP类型的created_at字段通过DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP属性自动使用了当前时间戳,这与NOW()函数的效果相同。

2.2 时间戳比较

NOW()函数返回的日期时间值也常用于与表中的其他时间戳字段进行比较,以查询特定时间段内的数据。

  1. -- 查询最近一天内插入的数据
  2. SELECT * FROM example WHERE created_at > NOW() - INTERVAL 1 DAY;

这个例子展示了如何使用NOW()函数结合日期时间运算来查询特定时间段内的数据。

2.3 报告和日志

在生成报告或记录日志时,NOW()函数常被用来记录报告或日志的生成时间,确保数据的时效性和准确性。

  1. INSERT INTO logs (message, created_at) VALUES ('System startup successful.', NOW());

3. NOW()函数的变种与替代

虽然NOW()函数是获取当前日期和时间的直接方式,但在某些特定场景下,你可能需要更灵活的日期时间处理。MySQL提供了几个与NOW()相关的函数和表达式,可以作为其变种或替代方案。

3.1 CURDATE() 和 CURTIME()
  • CURDATE():仅返回当前日期(不包含时间部分)。
  • CURTIME():仅返回当前时间(不包含日期部分)。

这两个函数在处理仅需要日期或时间的场景时非常有用。

3.2 SYSDATE()

SYSDATE()函数与NOW()类似,也用于返回当前的日期和时间。但是,它们在处理事务时的行为有所不同。在事务中,NOW()函数在SQL语句开始执行时获取一次时间值,并在整个事务中保持不变;而SYSDATE()函数则会在每次调用时都重新获取当前的日期和时间,即使它在同一个事务中被多次调用。

  1. START TRANSACTION;
  2. SELECT NOW(); -- 第一次调用,获取时间T1
  3. SELECT NOW(); -- 第二次调用,但返回的还是T1
  4. SELECT SYSDATE(); -- 第一次调用,获取时间T2
  5. SELECT SYSDATE(); -- 第二次调用,返回T3(如果T2T3之间有时间差)
  6. COMMIT;

4. NOW()函数的性能考虑

在大多数情况下,NOW()函数的性能开销是可以忽略不计的。然而,在极端情况下,如高并发环境下的频繁调用,任何额外的函数调用都可能会对性能产生影响。因此,在设计数据库和编写查询时,应尽量避免不必要的函数调用,尤其是在循环或大量数据处理中。

5. 实战演练:使用NOW()函数

假设我们正在设计一个电商网站的用户订单系统,需要记录每个订单的创建时间和最后更新时间。我们可以按照以下步骤设计表和插入数据:

  1. CREATE TABLE orders (
  2. order_id INT AUTO_INCREMENT PRIMARY KEY,
  3. user_id INT NOT NULL,
  4. product_id INT NOT NULL,
  5. quantity INT NOT NULL,
  6. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  7. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  8. );
  9. -- 插入订单数据
  10. INSERT INTO orders (user_id, product_id, quantity) VALUES (1, 101, 2);
  11. -- 查询订单信息,包括创建和更新时间
  12. SELECT order_id, user_id, product_id, quantity, created_at, updated_at FROM orders;

在这个例子中,虽然我们没有直接在INSERT语句中使用NOW()函数来设置created_at字段的值,但TIMESTAMP类型的自动初始化特性(DEFAULT CURRENT_TIMESTAMP)已经为我们完成了这项工作。同样,每当订单数据被更新时,updated_at字段也会自动更新为当前的日期和时间。

6. 总结

NOW()函数是MySQL中用于获取当前日期和时间的强大工具,它简单易用,在多种场景下都发挥着重要作用。通过本文的介绍,你应该已经掌握了NOW()函数的基本用法、应用场景、变种与替代方案,以及在使用时需要注意的性能考虑。希望这些内容能帮助你在数据库设计和数据管理中更加得心应手。


该分类下的相关小册推荐: