Sql server 存储时间和星期几

Sql server 存储时间和星期几,sql-server,database,database-design,Sql Server,Database,Database Design,挑战: 我有一个要求,我必须实施重复事件。我正在存储事件将再次发生的星期几、时间和日期范围 可能的解决方案: 将时间和星期日存储为字符串和枚举。 存储当前数据并设置当天的时间和日期 问题: 存储时间和工作日的最佳做法是什么 EDT:我正在使用SQL Server数据库此最佳方法可能取决于您使用的数据库。但是,有两种普遍的方法,都很合理 第一种是以数据库的本机格式存储日期和时间。大多数数据库都有从日期时间类型中提取星期几和时间的功能。您可以使用这些函数编写查询。通常,您会将这些字段存储为一个字段,

挑战: 我有一个要求,我必须实施重复事件。我正在存储事件将再次发生的星期几、时间和日期范围

可能的解决方案: 将时间和星期日存储为字符串和枚举。 存储当前数据并设置当天的时间和日期

问题: 存储时间和工作日的最佳做法是什么


EDT:我正在使用SQL Server数据库

此最佳方法可能取决于您使用的数据库。但是,有两种普遍的方法,都很合理

第一种是以数据库的本机格式存储日期和时间。大多数数据库都有从日期时间类型中提取星期几和时间的功能。您可以使用这些函数编写查询。通常,您会将这些字段存储为一个字段,但有时可能需要将日期和时间部分分开

第二个是有一个日历表。日历表将日期或日期ID作为键,然后包含您想知道的列。星期几将是一个明显的专栏

在某些情况下,日历表是首选解决方案。例如,如果您要将应用程序国际化,那么可以从表中获取一周中的某一天,这样就更容易获取字符串英语、希腊语、汉语、俄语、斯瓦希里语或您最喜欢的语言。或者,如果您想跟踪特定的假日,那么日历表也可以存储这些信息。或者,如果您有一个在奇怪的财务日历(如5-4-4)上运行的业务,那么日历表是一个不错的选择


无论哪种情况,都不需要在表中存储冗余的日期信息。您应该从内置函数或通过在引用表中查找所需内容来派生它。

此最佳方法可能取决于您使用的数据库。但是,有两种普遍的方法,都很合理

第一种是以数据库的本机格式存储日期和时间。大多数数据库都有从日期时间类型中提取星期几和时间的功能。您可以使用这些函数编写查询。通常,您会将这些字段存储为一个字段,但有时可能需要将日期和时间部分分开

第二个是有一个日历表。日历表将日期或日期ID作为键,然后包含您想知道的列。星期几将是一个明显的专栏

在某些情况下,日历表是首选解决方案。例如,如果您要将应用程序国际化,那么可以从表中获取一周中的某一天,这样就更容易获取字符串英语、希腊语、汉语、俄语、斯瓦希里语或您最喜欢的语言。或者,如果您想跟踪特定的假日,那么日历表也可以存储这些信息。或者,如果您有一个在奇怪的财务日历(如5-4-4)上运行的业务,那么日历表是一个不错的选择


无论哪种情况,都不需要在表中存储冗余的日期信息。您应该从内置函数或通过在引用表中查找所需内容来派生它。

另一种替代方法是使用计算列来表示您要查找的部分

CREATE TABLE dbo.foo
(
  bar DATETIME,
  bar_day_of_week AS DATEPART(WEEKDAY, bar),
  bar_time AS CONVERT(TIME, bar)
);

INSERT dbo.foo(bar) SELECT GETDATE();

SELECT bar, bar_day_of_week, bar_time FROM dbo.foo;

另一种选择是使用计算列来表示要查找的零件

CREATE TABLE dbo.foo
(
  bar DATETIME,
  bar_day_of_week AS DATEPART(WEEKDAY, bar),
  bar_time AS CONVERT(TIME, bar)
);

INSERT dbo.foo(bar) SELECT GETDATE();

SELECT bar, bar_day_of_week, bar_time FROM dbo.foo;

我通常更喜欢使用unix时间戳。它们的操作非常简单,大多数数据库系统都内置了将它们转换为字符串的支持。@Hunter从Unix时间戳中可以得到什么?它们不是人类可读的(当然,对于大多数人来说),在执行任何类型的日期/时间操作之前,都必须转换它们,而且SQL Server中没有内置的函数可以这样做-每次都必须自己执行日期添加。@AaronBertrand数据库只是一个存储单元,不需要人工读取。您的查询可以将它们转换为可读的格式。我想这只是我的一个偏好。@Hunter在SQL Server中,日期时间并没有存储为人类可读的值(它存储为两个整数)。但是,非常方便的是,诸如ManagementStudio、许多提供商和语言等客户机工具都知道这是一个日期时间,而不是一些大的随机数。您已经解释了为什么您认为datetime没有任何优势,但是您仍然没有解释是什么使Unix时间戳“更可取”。我通常更喜欢使用Unix时间戳。它们的操作非常简单,大多数数据库系统都内置了将它们转换为字符串的支持。@Hunter从Unix时间戳中可以得到什么?它们不是人类可读的(当然,对于大多数人来说),在执行任何类型的日期/时间操作之前,都必须转换它们,而且SQL Server中没有内置的函数可以这样做-每次都必须自己执行日期添加。@AaronBertrand数据库只是一个存储单元,不需要人工读取。您的查询可以将它们转换为可读的格式。我想这只是我的一个偏好。@Hunter在SQL Server中,日期时间并没有存储为人类可读的值(它存储为两个整数)。但是,非常方便的是,诸如ManagementStudio、许多提供商和语言等客户机工具都知道这是一个日期时间,而不是一些大的随机数。您已经解释了为什么您认为datetime没有任何优势,但是您仍然没有解释是什么使Unix时间戳“更可取”