Home  >  Article  >  Database  >  MySQL Date,Datetime和Timestamp字段类型

MySQL Date,Datetime和Timestamp字段类型

WBOY
WBOYOriginal
2016-06-07 16:24:451294browse

Datetime, Date和Timestamp类型是相关的。本文描述他们的特征,他们是如何类似的而又不同的。 Datetime类型用在你需要同时包含日期和时间信息的值时。MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显示Datetime值,支持的范围是'1000-01-01 00:00:00'到'9999-12

Datetime, Date和Timestamp类型是相关的。本文描述他们的特征,他们是如何类似的而又不同的。

Datetime类型用在你需要同时包含日期和时间信息的值时。MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显示Datetime值,支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。(“支持”意味着尽管更早的值可能工作,但不能保证他们可以。)

Date类型用在你仅需要日期值时,没有时间部分。MySQL检索并且以'YYYY-MM-DD'格式显示DATE值,支持的范围是'1000-01-01'到'9999-12-31'。

Timestamp列类型提供一种类型,你可以使用它自动地用当前的日期和时间标记INSERT或UPDATE的操作。如果你有多个Timestamp列,只有第一个自动更新。

自动更新第一个Timestamp列在下列任何条件下发生:

列没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。

列没有明确地在一个UPDATE语句中指定且一些另外的列改变值。(注意一个UPDATE设置一个列为它已经有的值,这将不引起Timestamp列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。)

你明确地设定Timestamp列为NULL。

除第一个以外的Timestamp列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()。

通过明确地设置希望的值,你可以设置任何Timestamp列为不同于当前日期和时间的值,即使对第一个Timestamp列也是这样。例如,如果,当你创建一个行时,你想要一个Timestamp被设置到当前的日期和时间,但在以后无论何时行被更新时都不改变,你可以使用这个属性:

让MySQL在行被创建时设置列,这将初始化它为当前的日期和时间。

当你执行随后的对该行中其他列的更改时,明确设定Timestamp列为它的当前值。

另一方面,你可能发现,当行被创建并且远离随后的更改时,很容易用一个你用NOW()初始化的Datetime列。

Timestamp值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。

在MySQL检索并且显示Timestamp值取决于显示尺寸的格式如下表。“完整”Timestamp格式是14位,但是Timestamp列可以用更短的显示尺寸创造:

所有的Timestamp列都有同样的存储大小,不考虑显示尺寸。最常见的显示尺寸是6、8、12、和14。你可以在表创建时间指定一个任意的显示尺寸,但是值0或比14大被强制到14。在从1~13范围的奇数值尺寸被强制为下一个更大的偶数。

使用一个常用的格式集的任何一个,你可以指定Datetime、DATE和Timestamp值:

'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的一个字符串。允许一种“宽松”的语法--任何标点可用作在日期部分和时间部分之间的分隔符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等价的。

'YYYY-MM-DD'或'YY-MM-DD'格式的一个字符串。允许一种“宽松”的语法。例如,'98-12-31', '98.12.31', '98/12/31'和'98@12@31'是等价的。

'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式的没有任何分隔符的一个字符串,例如,'19970523091528'和'970523091528'被解释为'1997-05-23 09:15:28',但是'971122459015'是不合法的(它有毫无意义的分钟部分)且变成'0000-00-00 00:00:00'。

'YYYYMMDD'或'YYMMDD'格式的没有任何分隔符的一个字符串,如果字符串认为是一个日期。例如,'19970523'和'970523'被解释作为'1997-05-23',但是'971332'是不合法的( 它有无意义的月和天部分)且变成'0000-00-00'。

YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的一个数字,如果数字认为是一个日期。例如,19830905132800和830905132800被解释作为'1983-09-05 13:28:00'。

YYYYMMDD或YYMMDD格式的一个数字,如果数字认为是一个日期。例如,19830905和830905被解释作为'1983-09-05'。

一个返回值可以在一个Datetime, DATE或Timestamp上下文环境中接受的函数,例如NOW()或CURRENT_DATE。

不合法Datetime, DATE或Timestamp值被变换到适当类型的“零”值('0000-00-00 00:00:00', '0000-00-00'或00000000000000)。

对于包括的日期部分分隔符的指定为字符串的值,不必要为小于10的月或天的值指定2位数字,'1979-6-9'与'1979-06-09'是一样的。同样, 对于包括的时间部分分隔符的指定为字符串的值,不必为小于10的小时、月或秒指定2位数字,'1979-10-30 1:2:3'与'1979-10-30 01:02:03'是一样的。

指定为数字应该是6、8、12或14位长。如果数字是8或14位长,它被假定以YYYYMMDD或YYYYMMDDHHMMSS格式并且年份由头4位数字给出。如果数字是6或12位长,它被假定是以YYMMDD或YYMMDDHHMMSS格式且年份由头2位数字给出。不是这些长度之一的数字通过填补前头的零到最接近的长度来解释。

指定为无分隔符的字符串用它们给定的长度来解释。如果字符串长度是8或14个字符,年份被假定头4个字符给出,否则年份被假定由头2个字符给出。对于字符串中呈现的多个部分,字符串从左到右边被解释,以找出年、月、日、小时、分钟和秒值,这意味着,你不应该使用少于 6 个字符的字符串。例如,如果你指定'9903',认为将代表1999年3月,你会发现MySQL把一个“零”日期插入到你的表中,这是因为年份和月份值99和03,但是日期部分丢失(零),因此该值不是一个合法的日期。

Timestamp列使用被指定的值的完整精度的存储合法的值,不考虑显示大小。这有几个含意:

总是指定年,月,和日,即使你的列类型是Timestamp(4)或Timestamp(2)。否则,值将不是一个合法的日期并且0将被存储。

如果你使用ALTER TABLE拓宽一个狭窄的Timestamp列,以前被“隐蔽”的信息将被显示。

同样,缩小一个Timestamp列不会导致信息失去,除了感觉上值在显示时,较少的信息被显示出。

尽管Timestamp值被存储为完整精度,直接操作存储值的唯一函数是UNIX_Timestamp(),其他函数操作在格式化了的检索的值上,这意味着你不能使用函数例如HOUR()或SECOND(),除非Timestamp值的相关部分被包含在格式化的值中。例如,一个Timestamp列的HH部分部被显示,除非显示大小至少是10,因此在更短的Timestamp值上试试使用HOUR()产生一个无意义的结果。

在某种程度上,你可以把一种日期类型的值赋给一个不同的日期类型的对象。然而,这可能值有一些改变或信息的损失:

如果你将一个DATE值赋给一个Datetime或Timestamp对象,结果值的时间部分被设置为'00:00:00',因为DATE值不包含时间信息。

如果你将一个Datetime或Timestamp值赋给一个DATE对象,结果值的时间部分被删除,因为DATE类型不存储时间信息。

记住,尽管Datetime, DATE和Timestamp值全都可以用同样的格式集来指定,但所有类型不都有同样的值范围。例如,Timestamp值不能比1970早或比2037网晚,这意味着,一个日期例如'1968-01-01',当作为一个Datetime或DATE值合法时,它不是一个正确Timestamp值,并且 如果赋值给这样一个对象,它将被变换到0。

当指定日期值时,当心某些缺陷:

允许作为字符串指定值的宽松格式能被欺骗。例如,值例如'10:11:12'可能看起来像时间值,因为“:”分隔符,但是如果在一个日期中使用,上下文将作为年份被解释成'2010-11-12'。值'10:45:15'将被变换到'0000-00-00',因为'45'不是一个合法的月份。

以2位数字指定的年值是模糊的,因为世纪是未知的。MySQL使用下列规则解释2位年值:

在00-69范围的年值被变换到2000-2069。

在70-99范围的年值被变换到1970-1999。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn