存储一个日期和两个时间字段

时间:2011-03-03 12:42:07

标签: sql-server tsql

我需要存储日程安排的日期和时间。计划包含一个日期字段和两个时间字段。

是否有可能将计划存储在一个数据库字段而不是两个(日期时间+日期时间)?

我正在使用SQL Server 2005。

谢谢!

3 个答案:

答案 0 :(得分:2)

无论是“开始”+“停止”,还是“开始”+“”持续时间“,您都有2条信息=存储2条信息。

使用字符串或XML毫无意义:这需要更多空间,更多处理,更多代码来搜索和使用。

答案 1 :(得分:1)

您可以尝试使用XML字段类型并在其中存储XML代码段,类似于以下内容:

<schedule date="2011-01-01" fromTime="12:00" toTime="14:00" />

然后,您可以在select中使用XQuery将结果集转换回“普通”基于行的结果集。基于我的示例的XML模式实现XQuery的示例查询可以如下:

SELECT
    [...]
  , Schedule.value('(/schedule/@date)[1]','datetime') as [Date]
  , Schedule.value('(/schedule/@fromTime)[1]','char(5)') as [FromTime]
  , Schedule.value('(/schedule/@toTime)[1]','char(5)') as [ToTime]
FROM [TABLE]

我并不是说将其存储为XML是最好的方式(正如其他答案正确地说明的那样),但是你问如果可行,我提出了解决方案......

答案 2 :(得分:1)

为什么要在一个字段而不是两个字段中存储有效的两个日期时间?是否有时间表可能有跨越时间的情况? (即01/03/2011 23:59,02 / 03/2011 01:35)?你不介意解析信息而不是立即准备好查询吗?

如果你真的想要,你没有理由不能将它存储为字符串类型,可能是逗号分隔,也许是建议使用的XML,但我不能说它是推荐的,因为日期/时间字段更节省空间,好的,快速/灵活的搜索目的,有许多有用的T-SQL函数,可以很容易地在日期/时间类型上使用,你很难在没有一些解析和转换/转换的情况下在字符串上使用它。

如果你能提出不使用两个日期时间字段的充分理由,我会有另一个甜甜圈! (ps。快乐胖周四)。

一个快速,可怕的邪恶想法......你可以使用日期时间的一部分来存储“差异”......将其隐藏到“秒”和“毫秒”值中,并将其应用于主日期/获得新价值的时间。有点hacky,但它可以完成这项工作,具体取决于您的范围要求。

-- Example: 01/03/2011 12:30:02
-- Translates into - first of March 2011, 12:30 to 14:30 (12:30 + (seconds * hours))

set @ModifiedDatetime =
    DATEADD(hour, DATEPART(second, @originalDateTime), @originalDateTime);

谨防四舍五入的错误......请考虑一下你正在做的事情的后果。每当有人滥用某种类型时,上帝会杀死一只小猫:)