何时使用VARCHAR和DATE/DATETIME

mah*_*n23 32 sql date

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

  1. 编码速度更快.以前我使用DATE,但日期格式化是一个真正的痛苦.
  2. 使用字符串比使用Date更耗电吗?谁在乎,我们生活在Ghz时代.
  3. 它在道德上是不正确的(lolwut?)这是其他用户告诉我的......

那么您更喜欢用什么来存储日期?SQL VARCHAR还是SQL DATE?

Kra*_*ica 41

为什么不用锤子拧螺丝?

因为它不适合这项工作.

VARCHAR版本的一些缺点:

  • 您无法轻松地将天数添加/减去VARCHAR版本.
  • 提取月/年更难.
  • 没有什么能阻止您将非日期数据放入数据库的VARCHAR列中.
  • VARCHAR版本是特定于文化的.
  • 您无法轻松对日期进行排序.
  • 如果您想稍后更改格式,则很难.
  • 这是非常规的,这将使其他开发人员更难理解.
  • 在许多环境中,使用VARCHAR将使用更多存储空间.这对于少量数据可能无关紧要,但在具有数百万行数据的商业环境中,这可能会产生很大的不同.

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

  • @Matt:我的父亲(他本人来自伯明翰)有时使用"Brummie螺丝刀"而不是"锤子".我猜锤子驱动器的习惯已经蔓延到了南方?:-) (2认同)

Sla*_*wek 15

如果您拥有超过2-3百万行的数据库,您就会知道为什么使用DATETIME比使用VARCHAR更好:)

简单的答案是,对于数据库 - 处理能力不再是问题.只是数据库大小是因为HDD的寻道时间.

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

  • 硬盘驱动器的磁头不必"移动"这么多
  • 您将在RAM中容纳更多数据

最终它总是硬盘的寻道时间会杀了你.例如.一些简单的带有多行的GROUP BY查询在磁盘上完成时可能需要几个小时,相比之下,由于寻道时间在RAM =>中完成几秒钟.

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

  • 当然,如果您将其存储在32位整数字段中,您还需要了解[2038年问题](https://en.wikipedia.org/wiki/Year_2038_problem). (2认同)

Ber*_*sch 6

两个原因:

  • 按日期排序结果
  • 对日期格式更改不敏感

那么让我们举一组看起来像这样的记录:

5/12/1999 | Frank N Stein
1/22/2005 | Drake U. La
10/4/1962 | Goul Friend
Run Code Online (Sandbox Code Playgroud)

如果我们按照您的方式存储数据,但按照订单中的日期排序,SQL将使用如下所示的结果集进行响应:

1/22/2005 | Drake U. La
10/4/1962 | Goul Friend
5/12/1999 | Frank N. Stein
Run Code Online (Sandbox Code Playgroud)

如果我们将日期存储为DATETIME,SQL将正确地响应它们,如下所示:

10/4/1962 | Goul Friend
5/12/1999 | Frank N. Stein
1/22/2005 | Drake U. La
Run Code Online (Sandbox Code Playgroud)

此外,如果您需要以不同的格式显示日期,例如YYYY-MM-DD,那么您需要转换所有数据或处理混合内容.当它存储为SQL DATE时,您将被迫在代码中进行转换,并且很可能有一个位置可以更改格式以显示所有日期 - 免费.