DATE,TIME,DATETIME和TIMESTAMP类型之间有什么区别

Sha*_*deh 26 mysql sql datetime

我需要在mysql中存储时间日期.所以我使用了NOW()功能.但我不知道我应该使用什么类型列 im phpmyadmin.应该注意的是,NOW()返回时间和日期如下:

2014-11-11 12:45:34
Run Code Online (Sandbox Code Playgroud)

这是一个解决方案,我可以使用分隔符来分隔日期和时间(2014-11-1112:45:34),然后分别将它们存储在DATE类型和TIME类型中.或者我可以使用VARCHAR类型将它们存储在一列中.但我认为这些方式并不标准.什么是存储日期和时间的标准类型?

这是我的查询:(我也不知道为什么NOW()功能不起作用)

INSERT INTO table (timedate) VALUES (NOW())
Run Code Online (Sandbox Code Playgroud)

Sat*_*aty 63

日期:它用于具有日期部分但没有时间部分的值.MySQL以1000-01-01格式检索并显示DATE值.支持的范围是9999-12-31

DATETIME:用于包含日期和时间部分的值.MySQL以1000-01-01 00:00:00格式检索并显示DATETIME值.支持的范围是9999-12-31 23:59:59

TIMESTAMP:用于包含日期和时间部分的值.TIMESTAMP有一系列的1970-01-01 00:00:01

TIME:其值2038-01-19 03:14:07(或'HHH:MM:SS'格式表示大小时值).TIME值的范围可以从-838:59:59.小时部分可能非常大,因为TIME类型不仅可以用来表示一天中的时间(必须小于24小时),还可以用于表示两个事件之间的经过时间或时间间隔(可能远大于24小时,甚至是负面的).

  • 这甚至不能真正区分`datetime`和`timestamp` (6认同)
  • @Anthony 不。“DATETIME”示例不包含时区,而“TIMESTAMP”示例包含“UTC”。 (2认同)
  • @BenJohnson 足够公平。有人应该编辑答案,以便更容易理解 (2认同)

Boo*_*boo 9

对于DATETIMETIMESTAMP之间的区别,我有一些不同的看法。甲DATETIME存储日期和时间与没有参考任何特定的时区的一个文字值。因此,我可以将DATETIME列设置为诸如'2019-01-16 12:15:00'之类的值以准确指示我的上次生日发生的时间。这是东部标准时间吗?太平洋标准时间?谁知道?将DATETIME列设置为某些值(例如NOW())时,将发生服务器的当前会话时区。存储的值将是使用当前会话时区的当前日期和时间。但是一次DATETIME 列已设置,无论当前时区是什么,它将显示相同的内容。

TIMESTAMP另一方面列占据您正在设置“2019年1月16日12点15分零零秒”值到它并解释它在当前会话中时区的内部表示相对于计算到1/1/1970 00:世界标准时间00:00。当该列显示时,它将根据当前时区转换回显示。将TIMESTAMP视为您所设置的值并将其从当前时区转换为UTC以进行存储,然后再将其转换回当前时区进行显示是有用的。

如果我的服务器在旧金山,但是我正在纽约运行一个事件,事件发生在9/1/1029的20:00,我将使用TIMESTAMP列来保存开始时间,请将会话时区设置为'America /纽约”,并将开始时间设置为“ 2009-09-01 20:00:00”。如果我想知道事件是否发生,无论当前时区设置如何,我都可以将开始时间与NOW()进行比较。当然,对于以有意义的方式显示给客户的角度来看,我需要设置正确的会话时区。如果我不需要进行时间比较,那么最好只使用DATETIME 列,无论当前会话时区是什么,它将正确显示(带有隐含的EST时区)。

  • 请记住,2038 年的问题不会等到 2038 年发生,它们现在就可能发生 - 例如,如果我有一个退休基金数据库,其中有 20 年的目标期限​​,并且我想存储该日期,它已经结束了,非常糟糕的事情将会发生。 (5认同)
  • [与 Y2K38 相关的已发生问题的现实示例](https://twitter.com/jxxf/status/1219009308438024200) (3认同)
  • 很棒的一点。请注意,“Timestamp”只能处理 1970 年到 2038-01-19 之间的日期,而“DateTime”可以处理 1000 年到 9999 年的日期。Timestamp 的主要用途是相当接近当前的日期时间。在我们到达 2038 年之前,它可能会延长到 2116 年](https://dev.mysql.com/worklog/task/?id=1872#targetText=Currently%20we%20support%20only%20dates,internal%20representation %20of%20TIMESTAMP%20type。)当使用 `DateTime` 时,我建议让输入应用程序与 UTC 相互转换。如果一致地执行此操作,则可以将 DateTime 视为 UTC 时间,从而消除歧义。 (2认同)

Hos*_*her 5

Saty描述了它们之间的差异。对于您的练习,您可以使用datetime为了保持NOW().

例如:

CREATE TABLE Orders
(
  OrderId int NOT NULL,
  ProductName varchar(50) NOT NULL,
  OrderDate datetime NOT NULL DEFAULT NOW(),
  PRIMARY KEY (OrderId)
)
Run Code Online (Sandbox Code Playgroud)

您可以在w3schools阅读更多内容。