何时使用日期时间或时间戳

发布于 2024-11-06 14:01:50 字数 50 浏览 3 评论 0原文

我已经搜索过这个但没有明确的答案(尤其是后者)。在什么情况下应该使用日期时间或时间戳?

I've searched for this but no clear answers (especially on the latter). In what cases should you use a datetime or timestamp?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

骄傲 2024-11-13 14:01:50

假设您使用的是 MS SQL Server(如果您没有使用,请参阅下面的更新):

一张表只能有一个时间戳
柱子。时间戳中的值
每次一行更新列
包含时间戳列的是
插入或更新。此属性
使时间戳列变得很差
候选键,尤其是主键
键。对行所做的任何更新
改变时间戳值,从而
更改键值。如果列
位于主键中,旧键值
不再有效,并且外键
引用旧值没有
有效期更长。如果表是
动态游标中引用的所有
更新改变了位置
光标中的行。如果该列是
在索引键中,所有更新
数据行也会生成更新
索引。

有关 MSDN 的信息

(如果您需要)针对一行存储日期/时间信息,并且不更改日期/时间,请使用 DateTime;否则,使用时间戳。

另请注意: MS SQL Server 时间戳字段既不是日期也不是时间,它们是数据更改时间相对顺序的二进制表示形式。

更新

正如您更新所说的MySQL:

TIMESTAMP 值转换自
当前时区转换为 UTC
存储,并从 UTC 转换回来
到当前时区
检索。 (这种情况仅发生在
TIMESTAMP数据类型,不适用于其他
类型,例如 DATETIME。)

引用自 MySQL 参考

更值得注意的是:

如果您存储 TIMESTAMP 值,并且
然后更改时区并检索
值,检索到的值为
与您存储的值不同。

因此,如果您正在使用跨时区的应用程序,并且需要日期/时间来反映各个用户的设置,请使用时间戳。如果无论时区如何都需要一致性,请使用 Datetime

Assuming you're using MS SQL Server (Which you're not, see the Update below):

A table can have only one timestamp
column. The value in the timestamp
column is updated every time a row
containing a timestamp column is
inserted or updated. This property
makes a timestamp column a poor
candidate for keys, especially primary
keys. Any update made to the row
changes the timestamp value, thereby
changing the key value. If the column
is in a primary key, the old key value
is no longer valid, and foreign keys
referencing the old value are no
longer valid. If the table is
referenced in a dynamic cursor, all
updates change the position of the
rows in the cursor. If the column is
in an index key, all updates to the
data row also generate updates of the
index.

Information on MSDN

If you need to store date/time information against a row, and not have that date/time change, use DateTime; otherwise, use Timestamp.

Also Note: MS SQL Server timestamp fields are not Dates nor Times, they are binary representations of the relative sequence of when the data was changed.

Update

As you've updated to say MySQL:

TIMESTAMP values are converted from
the current time zone to UTC for
storage, and converted back from UTC
to the current time zone for
retrieval. (This occurs only for the
TIMESTAMP data type, not for other
types such as DATETIME.)

Quote from MySQL Reference

More notably:

If you store a TIMESTAMP value, and
then change the time zone and retrieve
the value, the retrieved value is
different from the value you stored.

So if you are using an application across timezones, and need the date/time to reflect individual users settings, use Timestamp. If you need consistency regardless of timezone, use Datetime

静谧 2024-11-13 14:01:50

请参阅我应该使用字段“日期时间”还是“时间戳”?
它全面涵盖了该主题。

编辑 -
只是总结一下 MySQL 的属性和我的使用经验

- 时间戳 -

a) 每列 4 个字节(日期时间为 8 个字节)

  • LOWER RANGE ('1970-01-01 00:00:01' UTC到 '2038-01-09 03:14:07' UTC )比日期时间 - 所以绝对不要将其用于生日等。大多数使用模式实际上是为行更新等活动提供“NOW”的“时间戳”,等等

b) 在内部存储为整数

  • 性能方面...我的个人经验并不明确..有时它更快...有时比 DATETIME 慢。但它占用的空间更少。

c) 有时区信息!

  • 所以 - 如果我在 TIMESTAMP 中添加“2011-01-01 3:30”(当前时区为 EST - 波士顿).. 后来,我更改了服务器 & mysql 时区更改为 PST(加利福尼亚)并重新启动服务器 - 该值将更改为“2011-01-01 00:00” - (请确认...我很久以前就测试过这一点)。但是,DATETIME 将保持不变。

d) 所有 DATE() / DAY() / MONTH() 函数都适用于 TIMESTAMP 和 DATETIME

e) 在 MySQL 中,每个表可以有多个 TIMESTAMPS

  • (YES ,但是只有其中一个(第一个)会随着行更新的时间自动更新,而且...只有一个可以设置为 NOT NULL(想想第一个))

f)表中的第一个 TIMESTAMP 会自动更新已更新...

  • 因此,如果您将其用于其他目的,并且希望允许空值,请小心。 (在 DATETIME 和 TIMESTAMP 中都将 null 存储为“0000-00-00 00:00:00”)

我已将多个时间戳用于其他目的..需要节省空间(必须非常小心并牢记所有这些问题。

我的建议是,只有当你知道自己在做什么时,才使用 TIMESTAMP 来实现非时间戳目的。如果空间是一个巨大的问题(我的例子 - 15,000,000 行并且不断增长,8 个日期时间!))

See Should I use field 'datetime' or 'timestamp'?
It has a comprehensive coverage about the topic.

EDIT -
Just to summarize properties for MySQL and my experience with it-

Timestamp -

a) 4 bytes per column (compared to 8 for datetime)

  • LOWER RANGE ('1970-01-01 00:00:01' UTC to '2038-01-09 03:14:07' UTC ) THAN DATETIME - So definitely don't use it for birthdates etc. Most usage patterns are to actually provide a 'Timestamp' of 'NOW' for activities like row updates, etc etc.

b) stored internally as an integer

  • Performance wise... my personal experience has been ambiguous.. sometimes its faster... sometimes slower than DATETIME. It takes less space though.

c) Has timezone info!

  • so - if I add '2011-01-01 3:30' in TIMESTAMP (with curr timezone as EST - Boston).. later, i change the server & mysql timezone to PST(california) and restart server - the value will change to '2011-01-01 00:00' -- (PLEASE CONFIRM... i had tested this a long time ago). However, DATETIME will remain the same.

d) All the DATE() / DAY() / MONTH() functions work for both TIMESTAMP and DATETIME

e) In MySQL, you can have multiple TIMESTAMPS per table

  • (YES, however only one of them (the first) will be updated automatically with the time of row update, also... only one can be made NOT NULL (think the first))

f) first TIMESTAMP in a table is automatically updated...

  • so be careful if you use it for some other purpose.. and want to allow nulls there. (null stored as '0000-00-00 00:00:00' in both DATETIME and TIMESTAMP)

I have used multiple timestamps for other purposes.. needed the space saved (had to be very careful and keep all these issues in mind.

My advice, go for TIMESTAMP for non timestamp purposes only if u know what u are doing.. and if SPACE is a huge concern (my eg - 15,000,000 rows and growing and 8 datetimes!))

泅人 2024-11-13 14:01:50

我没有清楚地明白你的问题,但请参阅下面的链接。它可能会帮助您

http://www.sqlteam.com/article/timestamps -vs-日期时间-数据类型

I did not get your question clearly, but see below link. it may help you

http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

电影里的梦 2024-11-13 14:01:50
  • 在 MySQL 中,在 DateTime 类型上,您可以使用 DATE() 相关函数,而在 timestamp 上则不能。
  • 时间戳不能保存01-01-1970之前的值。
  • 另外,其中一个保留夏令时,而其他则不保留(我现在不记得是哪一个),

我倾向于总是选择 DateTime

  • In MySQL, on DateTime type you can work with DATE() related functions, whereas on timestamp you can't.
  • Timestamp can not hold values before 01-01-1970.
  • Also, one of them holds the daylight savings and other don't (I don't remember which one right now)

I tend to always choose DateTime.

巷子口的你 2024-11-13 14:01:50

需要指定数据库服务器。

一些服务器引擎会自动更新时间戳字段,因此可以用作乐观锁中的记录版本

Need to specify database server.

Some server engines will automatically update the timestamp fields, so it can be used as record version in Optimistic Locking

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文