如何选择合适的MySQL日期时间类型来存储你的时间

构建数据库写程序避免不了使用日期和时间,对于数据库来说,有多种日期时间字段可供选择,如 timestamp 和 datetime 以及使用 int 来存储 unix timestamp。

不仅新手,包括一些有经验的程序员还是比较迷茫,究竟我该用哪种类型来存储日期时间呢?

那我们就一步一步来分析他们的特点,这样我们根据自己的需求选择合适的字段类型来存储 (优点和缺点是比较出来的  , 跟父母从小喜欢拿邻居小孩子跟自己比一样的)

datetime 和 timestamp

  1. datetime 更像日历上面的时间和你手表的时间的结合,就是指具体某个时间。
  2. timestamp 更适合来记录时间,比如我在东八区时间现在是 2016-08-02 10:35:52, 你在日本(东九区此时时间为 2016-08-02 11:35:52),我和你在聊天,数据库记录了时间,取出来之后,对于我来说时间是 2016-08-02 10:35:52,对于日本的你来说就是 2016-08-02 11:35:52。所以就不用考虑时区的计算了。
  3. 时间范围是 timestamp 硬伤(1970-2038),当然 datetime (1000-9999)也记录不了刘备什么时候出生(161 年)。

timestamp 和 UNIX timestamp

  1. 显示直观,出问题了便于排错,比好多很长的 int 数字好看多了
  2. int 是从 1970 年开始累加的,但是 int 支持的范围是 1901-12-13 到 2038-01-19 03:14:07,如果需要更大的范围需要设置为 bigInt。但是这个时间不包含毫秒,如果需要毫秒,还需要定义为浮点数。datetime 和 timestamp 原生自带 6 位的微秒。
  3. timestamp 是自带时区转换的,同上面的第 2 项。
  4. 用户前端输入的时间一般都是日期类型,如果存储 int 还需要存前取后处理

总结:

  1. timestamp 记录经常变化的更新 / 创建 / 发布 / 日志时间 / 购买时间 / 登录时间 / 注册时间等,并且是近来的时间,够用,时区自动处理,比如说做海外购或者业务可能拓展到海外
  2. datetime 记录固定时间如服务器执行计划任务时间 / 健身锻炼计划时间等,在任何时区都是需要一个固定的时间要做某个事情。超出 timestamp 的时间,如果需要时区必须记得时区处理
  3. UNIX timestamps 使用起来并不是很方便,至于说比较取范围什么的,timestamp 和 datetime 都能干。
  4. 如果你不考虑时区,或者有自己一套的时区方案,随意了,喜欢哪个上哪个了
  5. laravel 是国际化设计的框架,为了程序员方便、符合数据库设计标准,所以 created_at updated_at 使用了 timestamp 是无可厚非的。
  6. 有没有一个时间类型即解决了范围、时区的问题?这是不可能的,不是还有 tinyInt BigInt 吗?取自己所需,并且 MySQL 是允许数据库字段变更的。
  7. 生日可以使用多个字段来存储,比如 year/month/day,这样就可以很方便的找到某天过生日的用户 (User::where(['month' => 8, 'day' => 12])->get())

构建项目的时候需要认真思考一下,自己的业务场景究竟用哪种更适合。选哪个?需求来定。

到此这篇关于如何选择合适的MySQL日期时间类型来存储你的时间的文章就介绍到这了,更多相关MySQL日期时间类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql常用日期时间/数值函数详解(必看)

    1.日期时间函数 时间转化秒函数:time_to_sec MySQL> select time_to_sec('01:01:01'); +-------------------------+ | time_to_sec('01:01:01') | +-------------------------+ | 3661 | +-------------------------+ 1 row in set (0.00 sec) 秒转化时间函数:sec_to_time mysql> select se

  • mysql 日期和时间函数

    mysql> SELECT something FROM tbl_name WHERE TO_DAYS(NOW()) – TO_DAYS(date_col) <= 30; DAYOFWEEK(date) 返回 date 的星期索引(1 = Sunday, 2 = Monday, ... 7 = Saturday).索引值符合 ODBC 的标准. mysql> SELECT DAYOFWEEK('1998-02-03′); -> 3 WEEKDAY(date) 返回 date 的星期

  • php Mysql日期和时间函数集合

    收集的比较全的Mysql日期和mysql时间函数DATE_FORMAT(date,format)  根据format字符串格式化date值.下列修饰符可以被用在format字符串中: %M 月名字(January--December)  %W 星期名字(Sunday--Saturday)  %D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等.)  %Y 年, 数字, 4 位  %y 年, 数字, 2 位  %a 缩写的星期名字(Sun--Sat)  %d 月份中的天数, 数字(00

  • MySQL日期数据类型、时间类型使用总结

    MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型        存储空间       日期格式                 日期范围 ------------ ---------   --------------------- ----------------------------------------- datetime       8 bytes   YYYY-MM-DD HH:MM:SS   1000-01-01 00:00:00 ~ 9999-12-31

  • 详解MySQL日期 字符串 时间戳互转

    平时比较常用的时间.字符串.时间戳之间的互相转换,虽然常用但是几乎每次使用时候都喜欢去搜索一下用法:本文将作为一个笔记,整理一下三者之间的 转换(即:date转字符串.date转时间戳.字符串转date.字符串转时间戳.时间戳转date,时间戳转字符串)用法,方便日后查看: 涉及的函数 date_format(date, format) 函数,MySQL日期格式化函数date_format() unix_timestamp() 函数 str_to_date(str, format) 函数 fro

  • mysql 查询指定日期时间内sql语句实现原理与代码

    在数据库教程设计时必须注意时间字段为int(11)这样,保存在数据库的是一个数字型日期时间戳,我们可以用mktime函数求出当前日期的时间戳进行加减就OK了,下面看实例 //一个月 复制代码 代码如下: $lastMonth = mktime(date('h'),date('i'),date('s'),date('m')-1,date('d'),date('y')); $where .= " dtime > $lastMonth"; //三个月 复制代码 代码如下: $lastT

  • MySQL 获得当前日期时间的函数小结

    1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +---------------------+ | now() | +---------------------+ | 2008-08-08 22:20:46 | +---------------------+ 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数: current_timestamp() ,current_timestamp ,localtime

  • mysql的日期和时间函数

    下面的查询选择所有 date_col 值在最后 30 天内的记录. mysql> SELECT something FROM tbl_name WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30; DAYOFWEEK(date) 返回 date 的星期索引(1 = Sunday, 2 = Monday, ... 7 = Saturday).索引值符合 ODBC 的标准. mysql> SELECT DAYOFWEEK('1998-02-03');

  • mysql 日期和时间格式转换实现语句

    这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> SELECT something FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30; DAYOFWEEK(date) 返回日期date的星期索引(1=星期天,2=星期一, --7=星期六).这些索引值对应于ODBC标准. mysql> select DAYOFWEEK('1998-02-03'); ->

  • mysql 获取当前日期函数及时间格式化参数详解

    MYSQL 获取当前日期及日期格式 获取系统日期: NOW() 格式化日期: DATE_FORMAT(date, format) 注: date:时间字段 format:日期格式 返回系统日期,输出 2009-12-25 14:38:59 select now(); 输出 09-12-25 select date_format(now(),'%y-%m-%d'); 根据format字符串格式化date值: %S, %s 两位数字形式的秒( 00,01, ..., 59) %I, %i 两位数字形

  • MySQL 获得当前日期时间 函数

    获得当前日期+时间(date + time)函数:now() mysql> select now(); +---------------------+ | now() | +---------------------+ | 2008-08-08 22:20:46 | +---------------------+ 获得当前日期+时间(date + time)函数:sysdate() sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysd

随机推荐