Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Sql 何时使用VARCHAR和日期/日期时间_Sql_Date - Fatal编程技术网

Sql 何时使用VARCHAR和日期/日期时间

Sql 何时使用VARCHAR和日期/日期时间,sql,date,Sql,Date,我们在Freenode上进行了编程讨论,当我试图使用VARCHAR(255)以以下格式存储日期变量时,出现了这个问题:D/MM/YYYY。所以问题是为什么使用VARCHAR来存储日期这么糟糕。以下是优点: 编写代码更快。以前我使用日期,但日期格式真的很麻烦 使用字符串比使用日期更耗电?谁在乎呢,我们生活在这个时代 这在道德上是不正确的(lolwut?)这是其他用户告诉我的 那么,您希望使用什么来存储日期呢?SQL VARCHAR或SQL DATE?两个原因: 按日期对结果进行排序 对日期格式更

我们在Freenode上进行了编程讨论,当我试图使用VARCHAR(255)以以下格式存储日期变量时,出现了这个问题:D/MM/YYYY。所以问题是为什么使用VARCHAR来存储日期这么糟糕。以下是优点:

  • 编写代码更快。以前我使用日期,但日期格式真的很麻烦
  • 使用字符串比使用日期更耗电?谁在乎呢,我们生活在这个时代
  • 这在道德上是不正确的(lolwut?)这是其他用户告诉我的
  • 那么,您希望使用什么来存储日期呢?SQL VARCHAR或SQL DATE?

    两个原因:

    • 按日期对结果进行排序
    • 对日期格式更改不敏感
    以一组记录为例,如下所示:

    5/12/1999 | Frank N Stein
    1/22/2005 | Drake U. La
    10/4/1962 | Goul Friend
    
    1/22/2005 | Drake U. La
    10/4/1962 | Goul Friend
    5/12/1999 | Frank N. Stein
    
    10/4/1962 | Goul Friend
    5/12/1999 | Frank N. Stein
    1/22/2005 | Drake U. La
    
    如果我们按您的方式存储数据,但按批准顺序排序,SQL将以如下所示的结果集进行响应:

    5/12/1999 | Frank N Stein
    1/22/2005 | Drake U. La
    10/4/1962 | Goul Friend
    
    1/22/2005 | Drake U. La
    10/4/1962 | Goul Friend
    5/12/1999 | Frank N. Stein
    
    10/4/1962 | Goul Friend
    5/12/1999 | Frank N. Stein
    1/22/2005 | Drake U. La
    
    如果我们将日期存储为DATETIME,SQL将按照如下顺序正确响应:

    5/12/1999 | Frank N Stein
    1/22/2005 | Drake U. La
    10/4/1962 | Goul Friend
    
    1/22/2005 | Drake U. La
    10/4/1962 | Goul Friend
    5/12/1999 | Frank N. Stein
    
    10/4/1962 | Goul Friend
    5/12/1999 | Frank N. Stein
    1/22/2005 | Drake U. La
    
    此外,如果您需要以不同的格式显示日期,例如YYYY-MM-DD,那么您需要转换所有数据或处理混合内容。当它存储为SQL日期时,您必须在代码中进行转换,并且很可能有一个点可以更改格式以显示所有日期——免费

    为什么不用锤子把螺丝钉钉进去呢

    因为它不是适合这项工作的工具

    VARCHAR版本的一些缺点:

    • 您无法轻松地向VARCHAR版本添加/减去天数
    • 仅提取月/年是比较困难的
    • 没有什么可以阻止您将非日期数据放入数据库的VARCHAR列中
    • VARCHAR版本是特定于区域性的
    • 你不能轻易地把日期分类
    • 如果您以后想更改格式,则很难更改格式
    • 它是非常规的,这将使其他开发人员更难理解
    • 在许多环境中,使用VARCHAR将占用更多的存储空间。这对于少量数据可能并不重要,但在具有数百万行数据的商业环境中,这可能会产生很大的影响

    当然,在你的爱好项目中,你可以做你想做的事。在专业环境中,我会坚持使用合适的工具来完成工作。

    DATE/DATETIME
    VARCHAR
    之间,我每次都会选择
    DATE/DATETIME
    。但还有一个被忽视的第三选择。将其存储为无符号整数

    在我的上一个项目中,我决定使用
    无符号整数
    ,我真的很满意这样的选择,而不是将其存储为
    日期/日期时间
    。因为我在客户端和服务器之间传递日期,所以它是我使用的理想类型。我不必将它存储为
    DATE
    ,也不必每次选择时都转换回来,我只需选择它,然后按我想要的方式使用它。如果要将日期选择为“人类可读”日期,可以使用
    FROM_UNIXTIME()
    函数

    此外,整数占用4个字节,而
    DATETIME
    占用8个字节。节省50%的存储空间


    Berin提出的排序问题也可以通过使用integer作为日期存储来解决。

    当您的数据库中有超过200-300万行时,您就会知道为什么使用DATETIME比使用VARCHAR更好:)

    简单的答案是,对于数据库,处理能力不再是问题。只是数据库的大小取决于硬盘的寻道时间

    基本上,使用现代硬盘,如果以随机顺序(通常是这种情况)读取记录,您可以每秒读取大约100条记录,因此您必须尽一切努力最小化数据库大小,因为:

    • 硬盘驱动器的磁头不需要“旅行”这么多
    • 您将在RAM中容纳更多数据
    最终,硬盘的寻道时间总是会杀死你。一些简单的多行分组查询在磁盘上完成可能需要几个小时,而在RAM=>中完成则需要几秒钟,这是因为查找时间


    对于VARCHAR,您不能进行任何搜索。如果您如此讨厌SQL处理日期的方式,只需在32位整数字段中使用unix时间戳即可。您将(基本上)拥有使用SQL日期字段的所有优点,您只需使用您选择的编程语言(而不是SQL函数)操作和格式化日期。

    为了简单性/一致性,我赞成使用日期/日期时间类型

    如果确实将其存储为字符串,请以以下格式存储:

    除此之外,ISO 8601日期/时间字符串(A)可正确校对,(B)可读,(C)与区域设置无关,以及(D)易于转换为其他格式。从ISO简介中抄袭,ISO 8601字符串提供

    对下列事项的陈述:

    • 日期
    • 一天中的时间
    • 协调世界时(UTC)
    • 偏移到UTC的本地时间
    • 日期和时间
    • 时间间隔
    • 重复时间间隔
    表示可以采用两种格式之一:基本格式 具有最少字符数和扩展格式的 这增加了字符以增强人类的可读性。例如 2003年1月3日可以用20030103表示 或2003-01-03

    [及]

    与许多本地使用的产品相比,具有以下优势 陈述:

    • 系统易于读写
    • 易于比较和分类
    • 语言独立
    • 较大的单位写在较小的单位前面
    • 对于大多数表示法,表示法很短且长度恒定
    最后一件事:如果您只需要存储一个日期,那么