MySQL时间字段TIMESTAMPDATETIME(自动更新毫秒存储)
Posted Copperxcx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL时间字段TIMESTAMPDATETIME(自动更新毫秒存储)相关的知识,希望对你有一定的参考价值。
文章目录
1. 数据类型简介
mysql
中关于日期和时间有DATE、TIME、DATETIME、TIMESTAMP
这几种数据类型:
- 1️⃣
DATE
:储存日期,格式为YYYY-MM-DD
,范围1000-01-01
到9999-12-31
; - 2️⃣
TIME
:储存时间,格式为hhh:mm:ss
,范围-838:59:59
到838:59:59
; - 3️⃣
DATETIME
:储存日期和时间,格式为YYYY-MM-DD hh:mm:ss
,范围1000-01-01 00:00:00
到9999-12-31 23:59:59
; - 4️⃣
TIMESTAMP
:储存时间戳,格式与DATETIME
相同,范围1970-01-01 00:00:01
到2038-01-19 03:14:07
;
赋值时通过上述格式的字符串赋值即可,还有一些如同NOW()
之类的函数也可赋值,但本质可以理解为返回了格式化字符串后赋值的。
其中的TIME
可以有缩写,但❌十分不建议❌这样做:
1112
将被转化为00:11:12
;11:12
将被转化为11:12:00
。
类似地,
DATE
也可以简写,参考官方文档📖2-Digit Years in Dates
对于后两者(DATETIME
和TIMESTAMP
)很类似,又有所不同:
1️⃣☀️首先能够轻松注意到TIMESTAMP
的储存范围比DATETIME
要小很多,那简单一想:
正经人谁还用
TIMESTAMP
啊❓
从官方介绍中了解到,TIMESTAMP
在存储时会存成UTC
时间,在取出时转换为服务器的所在时区的时间。因此能够提供时区自动变换的功能,不过看起来不是跨国大鳄🐊也不太用得上这功能……
UTC
:协调世界时,又称世界统一时间。
2️⃣🌔在未指定默认值时,TIMESTAMP
和DATETIME
的默认值根据是否允许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 默认值与自动更新
对TIMESTAMP
和DATETIME
类型字段,都可以将当前时间戳指定为默认值和/或自动更新值,只需要在创建表格时添加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).'天';
?>
执行的示例如下图:
请特别注意引号、括号都要用英文
<?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(自动更新毫秒存储)的主要内容,如果未能解决你的问题,请参考以下文章