MySQL时间字段TIMESTAMPDATETIME(自动更新毫秒存储)

Posted Copperxcx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL时间字段TIMESTAMPDATETIME(自动更新毫秒存储)相关的知识,希望对你有一定的参考价值。

文章目录

1. 数据类型简介

mysql中关于日期和时间有DATE、TIME、DATETIME、TIMESTAMP这几种数据类型:

  • 1️⃣DATE:储存日期,格式为YYYY-MM-DD,范围1000-01-019999-12-31
  • 2️⃣TIME:储存时间,格式为hhh:mm:ss,范围-838:59:59838:59:59
  • 3️⃣DATETIME:储存日期和时间,格式为YYYY-MM-DD hh:mm:ss,范围1000-01-01 00:00:009999-12-31 23:59:59
  • 4️⃣TIMESTAMP:储存时间戳,格式与DATETIME相同,范围1970-01-01 00:00:012038-01-19 03:14:07

赋值时通过上述格式的字符串赋值即可,还有一些如同NOW()之类的函数也可赋值,但本质可以理解为返回了格式化字符串后赋值的。

其中的TIME可以有缩写,但❌十分不建议❌这样做:

  • 1112将被转化为00:11:12
  • 11:12将被转化为11:12:00

类似地,DATE也可以简写,参考官方文档📖2-Digit Years in Dates

对于后两者(DATETIMETIMESTAMP)很类似,又有所不同:

1️⃣☀️首先能够轻松注意到TIMESTAMP的储存范围比DATETIME小很多,那简单一想:

正经人谁还用TIMESTAMP啊❓

从官方介绍中了解到,TIMESTAMP在存储时会存成UTC时间,在取出时转换为服务器的所在时区时间。因此能够提供时区自动变换的功能,不过看起来不是跨国大鳄🐊也不太用得上这功能……

UTC:协调世界时,又称世界统一时间

2️⃣🌔在未指定默认值时,TIMESTAMPDATETIME的默认值根据是否允许NULL值有区别:

// DATETIME默认允许NULL值,指定不允许NULL时默认值为0
CREATE TABLE t1 (
  dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP,         -- default NULL
  dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0
);
// TIMESTAMP默认不允许NULL值,指定允许NULL时默认值为NULL
CREATE TABLE t1 (
  ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,     -- default 0
  ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL
);

💡建议:这种知识点🔖不建议去记,在声明字段时显式指出☝️即可。

有兴趣可以参考官方文档📖The DATE, DATETIME, and TIMESTAMP Types

2. 方便的处理

2.1 默认值与自动更新

TIMESTAMPDATETIME类型字段,都可以将当前时间戳指定为默认值和/或自动更新值,只需要在创建表格时添加DEFAULT描述和ON UPDATE描述:

// ts和dt将在创建和修改时,被赋值为当前时间
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

官方文档提到CURRENT_TIMESTAMP有很多同义词,他们效果相同:

  • NOW()
  • CURRENT_TIMESTAMP()
  • LOCALTIME/LOCALTIME()
  • LOCALTIMESTAMP/LOCALTIMESTAMP()

2.2 毫秒及更高精度

可以在声明字段时添加小数点精度,只需要在TIMESTAMP后添加(n)即可,其中0 ≤ n ≤ 6

❗️❗️❗️但要注意:声明时各处的小数精度要一致,如:

CREATE TABLE t1 (
  ts TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),--正确
  dt DATETIME(4) DEFAULT CURRENT_TIMESTAMP(4) ON UPDATE CURRENT_TIMESTAMP(6) -- 错误
);

有兴趣可以参考官方文档📖Fractional Seconds in Time Values


如有错误 ❌ ,欢迎指正 ☝️~

如有收获 🍗,点赞👍/评论💬/收藏⭐️/关注👀~

PHP如何取得mysql字段值并记算时间?

目前是可以直接输出字段值到前端显示,如何增加一个距离开始时间还有多少天的提示 再判断一下已经开始或者结束 输出到前端页面 本人小白 希望可以给出详细代码

两种方式 :
1、可以直接用SQL 里的函数 sum() ;

如:"select sum(字段) as num from tab "; //sum 取该字段所有列的总和

2、用PHP函数 sum($array) ; //取数组中值的总和

当然 字段必须是int型的
参考技术A

下面以开始时间为例子,现在的程序代码是:

<?=$row[kssj]?>

这部分代码修改为下面的内容:

<?php
echo $row['kssj'];
list($y,$m,$d)=explode('-',$row['kssj']);
echo '还有'.(int)((mktime(0,0,0,$m,$d,$y)-time())/86400).'天';
?>

执行的示例如下图:

请特别注意引号、括号都要用英文

参考技术B <?=$row[kssj]?> 这里改为
<?php
echo $row[kssj];
$kssj=strtotime($row[kssj]); //开始时间转换为时间戳
$jssj=strtotime($row[jssj]); //结束时间转换为时间戳
$dqsj=time(); //当前时间戳
if($dqsj<$kssj) //尚未开始
echo " 距离开始时间还有".round(($kssj-$dqsj)/86400)."天";
elseif($dqsj<$jssj) //已经开始
echo " 已经开始";
else //已经结束
echo " 已经结束";

?>本回答被提问者采纳

以上是关于MySQL时间字段TIMESTAMPDATETIME(自动更新毫秒存储)的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何取得mysql字段值并记算时间?

mysql如何判断字段时间小于当前时间3天

mysql order by怎样多个时间字段排序

mysql储存时间选择怎样的字段类型

mysql 设置字段默认值为当前时间加5分钟

Mysql自动更新字段时间