首页 > 数据库 >面试官:MySQL 日期时间类型怎么选?

面试官:MySQL 日期时间类型怎么选?

时间:2023-05-17 11:33:12浏览次数:35  
标签:52 面试官 int timestamp datetime 日期 时间 MySQL 2016


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

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

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

datetime 和 timestamp

datetime 更像日历上面的时间和你手表的时间的结合,就是指具体某个时间。

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。所以就不用考虑时区的计算了。

时间范围是 timestamp 硬伤(1970-2038),当然 datetime (1000-9999)也记录不了刘备什么时候出生(161 年)。


timestamp 和 UNIX timestamp

显示直观,出问题了便于排错,比好多很长的 int 数字好看多了

int 是从 1970 年开始累加的,但是 int 支持的范围是 1901-12-13 到 2038-01-19 03:14:07,如果需要更大的范围需要设置为 bigInt。但是这个时间不包含毫秒,如果需要毫秒,还需要定义为浮点数。datetime 和 timestamp 原生自带 6 位的微秒。

timestamp 是自带时区转换的,同上面的第 2 项。

用户前端输入的时间一般都是日期类型,如果存储 int 还需要存前取后处理


总结

timestamp 记录经常变化的更新 / 创建 / 发布 / 日志时间 / 购买时间 / 登录时间 / 注册时间等,并且是近来的时间,够用,时区自动处理,比如说做海外购或者业务可能拓展到海外

datetime 记录固定时间如服务器执行计划任务时间 / 健身锻炼计划时间等,在任何时区都是需要一个固定的时间要做某个事情。超出 timestamp 的时间,如果需要时区必须记得时区处理

UNIX timestamps 使用起来并不是很方便,至于说比较取范围什么的,timestamp 和 datetime 都能干。

如果你不考虑时区,或者有自己一套的时区方案,随意了,喜欢哪个上哪个了。

laravel 是国际化设计的框架,为了程序员方便、符合数据库设计标准,所以 created_at updated_at 使用了 timestamp 是无可厚非的。

有没有一个时间类型即解决了范围、时区的问题?这是不可能的,不是还有 tinyInt BigInt 吗?取自己所需,并且 MySQL 是允许数据库字段变更的。

生日可以使用多个字段来存储,比如 year/month/day,这样就可以很方便的找到某天过生日的用户 (User::where(\['month' => 8, 'day' => 12\])->get())

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



标签:52,面试官,int,timestamp,datetime,日期,时间,MySQL,2016
From: https://blog.51cto.com/u_15989526/6289292

相关文章

  • mysql 基础知识
    --_在mysql中是表示任一字符,下面查的是名字等于*Aaaa的SELECT*FROMUSERWHERENAME='_Aaaa';--如果就要查名字是_Aaaa的人需要使用转移字符,把_当成普通字符SELECT*FROMUSERWHERENAME='\_Aaaa';--或者自定义字符SELECT*FROMUSERWHERENAME='$_Aaaa'......
  • 一个好用的命令行mysql客户端 mycli
    官网:https://www.mycli.net/支持自动补全,高亮提示,非常好用;查看表结构\dtsys_menu;有点遗憾的是没有展示注释信息,不可也可以用其它语句查看:showfullcolumnsfromsys_menu;showcreatetablesys_menu;查询结果导出\Tcsv;\o~/export.csv;SELECT*FROMt_t......
  • MySQL触发器Trigger加载以及目前局限
    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:亮文章来源:GreatSQL社区原创概念介绍首先需要知道MySQL中触发器特点,以及表table相关触发器加载方式MySQL中单个trigger仅支持单事件触发即单......
  • MYSQL因IN的范围太大导致索引失效问题
    背景最近发现有个用于统计的门店串码激活数量的SQL特别慢,将其摘出来大致如下SELECTa.sku_idasskuId,a.store_idasstoreId,count(*)assaleQtyFROMall_imei_infoawherea.activated_time>=1675530000000anda.activated_time<=1675616399999anda.stor......
  • mysql从5.7升级到8.0的注意事项
    ####################################(1)sql_mode全局变量:在升级MySQL版本到8.0的过程中,需要关注sql_mode参数默认值的变化,8.0版本sql_mode不支持NO_AUTO_CREATE_USER,要避免配置的sql_mode中带有NO_AUTO_CREATE_USER(2)mysql_native_password插件:MySQL8.0.4开始,默认身份认证开始改变......
  • Oracle版面本的MySQL8.0的配置文件 my.cnf
    ##############################创建用户和用户组:groupaddworkuseraddwork  准备目录:mkdir-p/home/work/mysql_3306mkdir-p/home/work/mysql_3306/datamkdir-p/home/work/mysql_3306/etcmkdir-p/home/work/mysql_3306/tmpmkdir-p/home/work/mysql_3306/logmkd......
  • Windows安装、配置、卸载MySQL教程
    MySQL是一个关系型数据库管理系统,目前为Oracle旗下产品,它具有开源、体积小、速度快的优点,许多网站使用的都是MySQL数据库。简单而言,MySQL数据库核心功能就是用来存储数据的。MySQL数据库分为社区版和商业版,这里介绍的是社区版的安装教程一、下载MySQL打开MySQL官网下载链......
  • mysql update语法 竟然不支持limit区间限制
    首先查询可以这样写,没毛病的SELECT*fromaLIMIT1000,2000 1.然后看一个不是区间的limit,更新满足条件的前1000条,没问题updateaseta.imp_date=4wherea.is_sync=0limit10002.这样写是错误的updateaseta.imp_date=4wherea.is_sync=0limit1001,2000......
  • .Net 5 CanalSharp Mysql CDC (增量同步,捕获变更数据)Docker 系列之 Canal (CDC 增量
    CanalSharp阿里云的解决方案,需要两部分Canal 服务端要和Mysql连在一起(目前我是用docker部署的服务)另外一部分就是CanalSharp单独的客户端服务(.Net5服务)CanalSharp文档可以参考:https://canalsharp.azurewebsites.net/zh/安装服务,可以点击下边的连接。Docker系列之Canal......
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
    之前业务需要捕捉到业务数据增量部分,并对其进行宽表处理,这也是其中的一个技术方案,方案主要是用了CDC的技术。CDC全称是ChangeDataCapture,捕获变更数据,是一个比较广泛的概念,只要是能够捕获所有数据的变化,比如数据库捕获完整的变更日志记录增、删、改等,都可以称为CDC。该功能被......