Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何最好地在MySql中存储日期/时间?_Mysql_Delphi_Datetime - Fatal编程技术网

如何最好地在MySql中存储日期/时间?

如何最好地在MySql中存储日期/时间?,mysql,delphi,datetime,Mysql,Delphi,Datetime,我应该先存储Delphi TDateTIme还是转换为Unix时间戳?或者可能是一根绳子 我应该如何在MySql中声明该列?作为Double或DateTime(如果使用Unix时间戳,则为整数) Whta是“正确的”,或者,如果我希望能够显示带有“yyyy-mm-dd hh:mm:ss”(或类似内容)的字符串,并且能够通过比较两个值获得经过的时间,那么最简单的方法是什么 顺便说一句,该程序将只在一个tiemzone中使用-该tiemzone没有夏令时 我很困惑,似乎在任何地方都找不到讨论这个问题

我应该先存储Delphi TDateTIme还是转换为Unix时间戳?或者可能是一根绳子

我应该如何在MySql中声明该列?作为Double或DateTime(如果使用Unix时间戳,则为整数)

Whta是“正确的”,或者,如果我希望能够显示带有“yyyy-mm-dd hh:mm:ss”(或类似内容)的字符串,并且能够通过比较两个值获得经过的时间,那么最简单的方法是什么

顺便说一句,该程序将只在一个tiemzone中使用-该tiemzone没有夏令时

我很困惑,似乎在任何地方都找不到讨论这个问题的机会。有什么有用的URL吗?

这可能对您有用。这取决于你是否想使用时区,但即使你现在不需要它们,如果将来不可能使用它们,也要重新考虑


我会用DATETIME。它更容易被人阅读

我想让MySQL按照自己的意愿处理日期/时间,即作为datetime字段。它的范围很大(不受时代限制)


请参见此处:

MySQL应该有一个本机日期格式,这是首选格式,因为这样可以使用SQL日期函数(年、月等)


在我的一个数据库表中,有一个字段被定义为Delphi datetime—回想起来,这是一个错误,因为很难在此字段上进行筛选或显示值。这两个操作都需要在调用程序中进行特殊处理,而不是在数据库中进行处理。

您可以阅读中的MySQL日期和时间类型以及中的函数

根据我的经验,使用MySQL和SQL Server(尽管不是使用Delphi本身),您可以很好地将日期和时间值存储在数据库的日期和时间格式中。这使您可以使用数据库的日期和时间功能,并利用其日期和时间功能的优化实现。如果将日期时间值存储为双精度或整数Unix时间戳之类的通用值,则将缺少优化,并且必须实现自己的等效日期和时间函数

根据OP编辑的问题更新

可以使用类似于
%Y%m%d%k:%i:%s“
的格式字符串为您提供类似“yyyy-mm-dd hh:mm:ss”的字符串

将为您提供一个时间间隔类型,给出两个日期时间值之间的差异

  • 我应该先存储Delphi TDateTIme还是转换为Unix时间戳

    通常情况下,两者都不应该做:数据库层中的数据类型本身应该(尽可能)有意义,而不是依赖于应用程序来解释它们。因此,这使数据库能够根据需要轻松地从SQL操作/解释它们(并且还使您能够在将来轻松地从另一个应用程序代码库访问相同的数据)

    MySQL有,其中只有两个同时存储日期和时间:
    DATETIME
    TIMESTAMP

    正如其他人所暗示的,区别在于您是否希望存储时区——尽管我发现这是一种令人困惑的看待方式:

    • TIMESTAMP
      使用会话变量将输入转换为UTC时间戳,然后再次转换为输出:它用于指定准确的时间点

    • DATETIME
      只存储日期和时间而不考虑时区,就像拍摄日历和时钟的照片一样:它对于全局指定在同一本地时间发生的事件非常有用

  • 我应该如何在MySql中声明该列?作为Double或DateTime(如果使用Unix时间戳,则为整数)

    正如声明任何其他列一样,在列名之后指定相关的数据类型

    请注意,
    TIMESTAMP
    具有附加功能,例如,如果需要,您可能希望在列声明中禁用这些功能

  • Whta是“正确的”,或者,如果我希望能够显示带有“yyyy-mm-dd hh:mm:ss”(或类似内容)的字符串,并且能够通过比较两个值获得经过的时间,那么最简单的方法是什么

    使用上面的一种时态类型,您将能够完成所有这一切(根据需要使用)。
    TIMESTAMP
    DATETIME
    类型的默认输出是
    'YYYY-MM-DD HH:MM:SS'
    格式的字符串

    特别是,比较两个值的“运行时间”可以通过MySQL函数获得:

    选择TIMEDIFF(结束,开始)作为已用时间
    从我的桌子上
    哪里
    

  • 有许多帖子描述了在mysql中保存datetime的最佳方法,例如

    如果您决定将日期时间转换为Unix时间戳,并将其保存为整数

    注意以下几点:

    • Delphi函数DateTimeToUnix(strotdatetime('2013-11-22 16:34:45')
      使用本地时区进行对话

    • MYSQL函数UNIX_时间戳('2013-11-22 16:34:45') 使用GMT时区进行对话


    取决于您是否打算存储更新的时区+1问题。谢谢,@njzk2