mysql中DATETIME,DATE和timestamp和datetime的区别

mysql中datetime比较大小问题 - voker - 博客园
select sum(studychj) as tofflinejz from afterline where checkflag=1 and studytype=1 and studybegin>=' 00:00:00' and studyend unix_timestamp(' 17:39:05') and unix_timestamp(time1) = convert(date,表名.datetime列名)
三种方法待求证,总之是不要用字符串这么直接比Mysql中int,DateTime,Timestamp使用区别
& 2013 年 12 月 4 日
时间在我们开发中应用非常普遍,大部分开发中我们将用Mysql的datetime格式来存储,但是对于经常用时间来排序或者查询的应用中,我们要将时间做成索引,这个就跟查询效率很有关系,但是很多程序员会用int来存时间戳,然后再进行处理
1、首先是我们分析datetime长度是8个字节,INT的长度是4个字节,存储空间上比datatime少。
2、int存储索引的空间也比datetime少,排序效率高,查询速度比较快。
3、方便计算,unix时间戳有点就是方便计算。
总结了一下timestamp和datetime的区别:
1、timestamp有范围限制1970 ~ 2037
2、timestamp支持default current_timestamp 来设置默认自动当前时间
3、timestamp支持on update current_timestamp 来设置更新时自动当前时间
4、timestamp时区相关,存储时以UTC时间保持,查询时转换为当前时区,
即如果在东8区的08:00:00分保存的数据,在东9区看到的是09:00:00
5、timestamp 4个字节存储(实际上就是int),datetime 8个字节
6、如果timestamp的值超出范围,mysql不会报错
7、如果是自动更新模式,手动修改数据导致timestamp字段更新
8、同时有两个timestamp字段默认值为current_timestamp会报错
9、如果mysql在maxdb模式下,timestamp等同于datetime,也就是说timestamp
受服务器模式影响
网上还有还一个TIMESTAMP 和INT比较的例子,timestamp效率比int不会差,而且timestamp有自动更新功能
列的显示格式与datetime列相同。
换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。
以”YYYY-MM-DDHH:MM:SS”格式检索和显示datetime值。支持的范围为” 00:00:00″到” 23:59:59″
TIMESTAMP值不能早于1970或晚于2037
1、4个字节储存(Time stamp value is stored in 4 bytes)
2、值以UTC格式保存( it stores the number of milliseconds)
3、时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。
1、8个字节储存(8 bytes storage)
2、实际格式储存(Just stores what you have stored and retrieves thesamething which you have stored.)
3、与时区无关(It has nothing to deal with the TIMEZONEandConversion.)
2015年三月 &(16)
2015年二月 &(49)
2015年一月 &(60)
2014年十二月 &(56)
2014年十一月 &(65)
2014年十月 &(68)
2014年九月 &(49)
2014年八月 &(58)
2014年七月 &(69)
2014年六月 &(82)
2014年五月 &(92)
2014年四月 &(97)
2014年三月 &(85)
2014年二月 &(71)
2014年一月 &(74)
2013年十二月 &(114)
2013年十一月 &(109)
2013年十月 &(121)
2013年九月 &(107)
2013年八月 &(144)
2013年七月 &(153)
2013年六月 &(122)
2013年五月 &(135)
2013年四月 &(137)
2013年三月 &(123)
2013年二月 &(28)
2013年一月 &(82)
2012年十二月 &(393)
2012年十一月 &(62)
2012年十月 &(48)
2012年九月 &(57)
2012年八月 &(101)
2012年七月 &(117)
2012年六月 &(122)
2015年四月
6789101112
13141516171819
20212223242526mysql中DATETIME、DATE和TIMESTAMP的区别
今天做数据库详细设计时,发现许多字段有的是date类型,有的是datetime类型,不知为什么会有两种时间类型,跟Oracle很不同,时间紧就没直接查,晚上忙完工作,查了一下,真有细致的区别,记下来吧!
DATETIME、DATE 和 TIMESTAMP
类型是相似的。本篇描述了它们的特性以及它们的相似点与不同点。
DATETIME 类型可用于需要同时包含日期和时间信息的值。MySQL 以 'YYYY-MM-DD HH:MM:SS' 格式检索与显示
DATETIME 类型。支持的范围是 ' 00:00:00' 到 '
23:59:59'。(“支持”的含义是,尽管更早的值可能工作,但不能保证他们均可以。)
DATE 类型可用于需要一个日期值而不需要时间部分时。MySQL 以 'YYYY-MM-DD' 格式检索与显示 DATE
值。支持的范围是 '' 到 ''。
TIMESTAMP 列类型提供了一种类型,通过它你可以以当前操作的日期和时间自动地标记 Insert 或Update
操作。如果一张表中有多个 TIMESTAMP 列,只有第一个被自动更新。
“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的显示尺寸创造
最常见的显示尺寸是6、8、12、和14。
你可以在创建表时指定一个任意的显示尺寸,但是定义列长为0或比14大均会被强制定义为列长14。
列长在从1~13范围的奇数值尺寸均被强制为下一个更大的偶数。
定义字段长度 强制字段长度
TIMESTAMP(0) -& TIMESTAMP(14)
TIMESTAMP(15)-& TIMESTAMP(14)
TIMESTAMP(1) -& TIMESTAMP(2)
TIMESTAMP(5) -& TIMESTAMP(6)
所有的TIMESTAMP列都有同样的存储大小,
使用被指定的时期时间值的完整精度(14位)存储合法的值不考虑显示尺寸。
不合法的日期,将会被强制为0存储
自动更新第一个 TIMESTAMP 列在下列任何条件下发生:
列值没有明确地在一个 Insert 或 LOAD DATA INFILE 语句中被指定。
列值没有明确地在一个 Update 语句中被指定,并且其它的一些列值已发生改变。(注意,当一个 Update
设置一个列值为它原有值时,这将不会引起 TIMESTAMP 列的更新,因为,如果你设置一个列值为它当前值时,MySQL
为了效率为忽略更新。)
明确地以 NULL 设置 TIMESTAMP 列。
第一个列以外其它 TIMESTAMP 列,可以设置到当前的日期和时间,只要将该列赋值 NULL 或 NOW()。
任何 TIMESTAMP 列均可以被设置一个不同于当前操作日期与时间的值,这通过为该列明确指定一个你所期望的值来实现。这也适用于第一个
TIMESTAMP 列。这个选择性是很有用的,举例来说,当你希望 TIMESTAMP
列保存该记录行被新添加时的当前的日期和时间,但该值不再发生改变,无论以后是否对该记录行进行过更新:
当该记录行被建立时,让 MySQL 设置该列值。这将初始化该列为当前日期和时间。
以后当你对该记录行的其它列执行更新时,为 TIMESTAMP 列值明确地指定为它原来的值。
另一方面,你可能发现更容易的方法,使用 DATETIME 列,当新建记录行时以 NOW()
初始化该列,以后在对该记录行进行更新时不再处理它。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。当前位置:&&
mysql数据类型datetime,date和timestamp比较
&&&&发布时间:&&
&&&&datetime 显示为'YYYY-MM-DD HH:MM:SS'格式,范围为' 00:00:00'到' 23:59:59'date
显示为'YYYY-MM-DD'格式,范围为''到''timestamp 范围从' 00:00:01'UTC ...
datetime &显示为'YYYY-MM-DD HH:MM:SS'格式,范围为' 00:00:00'到' 23:59:59'date & & &显示为'YYYY-MM-DD'格式,范围为''到''timestamp 范围从' 00:00:01'UTC 到' 03:14:07'UTCdatetime和timestamp比较datetime和timestamp 相同点:显示格式相同,TIMESTAMP列的显示格式与DATETIME列相同。换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。datetime和timestamp不同点:1)范围datetime 以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值。支持的范围为' 00:00:00'到' 23:59:59'TIMESTAMP值不能早于1970或晚于2037.2)储存TIMESTAMP1.4个字节储存(Time stamp value is stored in 4 bytes)2.值以UTC格式保存( it stores the number of milliseconds)3.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。datetime1.8个字节储存(8 bytes storage)2.实际格式储存(Just stores what you have stored and retrieves the same thing which you have stored.)3.与时区无关(It has nothing to deal with the TIMEZONE and Conversion.)其它相关介绍1. 指定值指定datetime值时,可以用' 11:20:30',' 11*20*30',' 11^20^30',' 11+20+30'等,效果是一样的。指定date值时,与上类似。指定datetime值时,也可以用字符串'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式,如'30'或 '',但'30'(分钟为90)会被解析为“零”值:' 00:00:00'。指定date值时,与上类似。指定datetime值时,也可以用数字YYYYMMDDHHMMSS或YYMMDDHHMMSS格式,如30或 。指定date值时,与上类似。指定datetime、date或timestamp值时,也可以用now()或current_date的值。指定datetime、date或timestamp值时,月、日、时、分、秒,若小于10,可以只写1位,如' 11:30:30'与' 11:30:30'一样。用数字指定时间时,可以为6、8、12或14位,6位表示YYMMDD,8位表示YYYYMMDD,12位表示YYMMDDHHMMSS,14位表示 YYYYMMDDHHMMSS。用不带分割符的字符串指定时间时,如果字符串为8位或14位的,那么认为年份为YYYY,否则认为年份为YY,之后按顺序解析月日时分秒。2. 不同类型转换date值赋给datetime或timestamp时,时间部分为'00:00:00'。datetime或timestamp值赋给date时,时间部分被去掉。转换时注意其表示范围有所不同,超出范围的将被转为“零”值。3. 注意'10:11:12'会被转为' 00:00:00'或''。4. timestamp类型从当前时区转成UTC保存,要读取时,再从UTC转成当前时区。(不发生在datetime类型上)。当前时区对应time_zone系统变量(缺省值为'System'表示用系统变量system_time_zone的值)系统变量system_time_zone的值在启动MySQL时指定,一般去TZ环境变量,或执行mysqld_safe时用--timezone选 项。(linux 安 装时挑选时区,安装后时区保存在/etc/sysconfig/clock文件里。)若将timestamp类型字段定义为default current_timestamp,那么插入一条记录时,该timestamp字段自动被赋值为当前时间。若将timestamp类型字段定义为on update current_timestamp,那么修改一条记录时,该timestamp字段自动被修改为当前时间。在一个表里面的timestamp字段只能有下面4种定义:1). 是default current_timestamp插入时系统自动赋值,插入时若在SQL 语句中指定该字段的值,则用SQL语句中的指定值。修改时时间值不自动改变,但可以在SQL语句中指定其值。2). 是on update current_timestamp插入时系统不自动赋值(字段为“零”值),但可以在SQL语句中指定该字段的值。修改时,系统自动赋值,但若SQL语句中指定其值,则用SQL语句中的指定值。3).两个都有default current_timestamp on update current_timestamp如果timestamp后面啥都不写,也相当于2个都有。插入修改时系统自动赋值,SQL语句中若指定,则用SQL语句中的指定值。4).如果default 后面写个常数,如default 00,那么插入时即为这个值。其他与上面类似。另外,一个表里面,如果想定义第2个timestamp字段,而且想让第2个字段有系统自动修改的机制,那么之前的那个字段一定要赋予default 常数(即上面第4点),然后,再给这个新的timestamp字段进行如上abc的定义,区别是这个新的timestamp字段不能后面啥不都写,如果啥都不写,那么插入和修改时系统不会自动赋值。依次类推,再想定义第3个timestamp字段,而且想让第3个字段有系统自动修改的机制,那么之前第2个timestamp字段一定要赋予default 常数(即上面第4点),然后,再给这个新的timestamp字段进行如上abc的定义,区别跟前面一样。上述current_timestamp还可以用它的同义词 current_timestamp(),now(),localtime,localtime(),localtimestamp,localtimestamp() 代替。timestamp字段缺省不允许空值,如果指定它的值为null,实际上就是用当前时间值赋给他了。但是,可以这样定义:col1 timestamp null default null, 注释:该字段可以为null,插入时缺省就是null,如果赋值null,那也真是null而不是当前时间值。col2 timestamp null default 0, & & 注释:该字段可以null,插入时缺省为0,如果赋值null,那也真是null而不是当前时间值。如果MySQL服务器以MAXDB SQL模式运行,那么timestamp等同于datetime类型,前面说的timestamp类型的所有描述都消失。timestamp时间范围测试:mysql& dro
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql& create table tt(time_stamp timestamp);
Query OK, 0 rows affected (0.06 sec)
mysql& insert into tt values(07);
Query OK, 1 row affected (0.01 sec)
mysql& insert into tt values(08);
ERROR ): Incorrect datetime value: '08' for column 'time_
stamp' at row 1
mysql& select *
+---------------------+
| time_stamp
+---------------------+
11:14:07 |
+---------------------+
1 row in set (0.00 sec)然后清空表.mysql&
Query OK, 15 rows affected (0.03 sec)
mysql& insert into tt values(01);
Query OK, 1 row affected (0.03 sec)
mysql& insert into tt values(00);
ERROR ): Incorrect datetime value: '00' for column 'time_
stamp' at row 1
mysql& select *
+---------------------+
| time_stamp
+---------------------+
08:00:01 |
+---------------------+
1 row in set (0.00 sec)从上面这个实验可以看出,当我插入时间07时,插入成功.当插入08时,显示错误.当我插入时间01时,插入成功.当插入00时,显示错误.接着我又对date和datetime做了实验,发现date的范围是到.datetime的范围是 00:00:00到 23:59:59.mysql&
Query OK, 0 rows affected (0.02 sec)
mysql& create table tt(date date);
Query OK, 0 rows affected (0.12 sec)
mysql& insert into tt values("");
Query OK, 1 row affected (0.03 sec)
mysql& select *
+------------+
+------------+
+------------+
1 row in set (0.00 sec)
mysql& insert into tt values("");
Query OK, 1 row affected (0.02 sec)
mysql& select *
+------------+
+------------+
+------------+
2 rows in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
mysql& create table tt(date_time datetime);
Query OK, 0 rows affected (0.04 sec)
mysql& insert into tt values(" 00:00:00");
Query OK, 1 row affected (0.02 sec)
mysql& insert into tt values(" 23:59:59");
Query OK, 1 row affected (0.02 sec)
mysql& select *
+---------------------+
| date_time
+---------------------+
00:00:00 |
23:59:59 |
+---------------------+
2 rows in set (0.00 sec)
169IT站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.转载请注明:文章转载自:[]本文标题:
本类别最新文章推荐:
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!
(C)2012-,站长邮箱:www_169it_(请将#改为@)}

我要回帖

更多关于 mysql datetime类型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信