什么是在SQL Server数据库中存储时间间隔的最佳方法

leo*_*ora 10 sql-server runtime

我有一个表格,我想跟踪时间,所以有效的条目可能是:

  • 1小时3分钟
  • 47分钟
  • 10个小时
  • 3分14秒

最适合使用哪种字段类型.我显然可以使用varchar.但我认为可能有更好的东西,因为我想运行查询以总计多个记录的时间量.

Aar*_*ght 13

千万不能使用字符类型来存储日期/时间信息.

在SQL Server 2008中,您具有此time类型,如果您的时间间隔小于1天,则应使用此类型.在以前的版本中,或者如果需要存储更大的间隔,则必须使用datetime或smalldatetime(取决于您需要的精度).

另一种选择是选择时间单位 - 比如分钟 - 并且只使用一个int值来表示单位数.只需确保(a)您选择的单位实际上足够精确,以记录您需要跟踪的最小间隔,并且(b)实际数字类型足够大以容纳您需要跟踪的最大间隔.A smallint可能足以跟踪一天内的分钟数; 另一方面,跟踪10年时间范围内的毫秒数必须存储为a bigint.


Luk*_*Led 5

只需使用整数来存储间隔,以秒为单位.DATEDIFF返回整数.编写一个将其转换为文本的函数.这个需要一些adjustmens(所以它显示"1分钟",而不是"1分钟"),但应该工作正常:

CREATE FUNCTION dbo.SecondsToText(@seconds int)
RETURNS VARCHAR(100)
AS
BEGIN
  declare @days int;
  set @days = @seconds/(3600 * 24);
  declare @hours int;
  set @hours = (@seconds - @days * 3600 * 24) / 3600;
  declare @minutes int;
  set @minutes = (@seconds - @days * 3600 * 24 - @hours * 3600) / 60;
  set @seconds = (@seconds - @days * 3600 * 24 - @hours * 3600 - @minutes * 60);
  RETURN 
    RTRIM(CASE WHEN @days > 0 THEN CAST(@days as varchar) + ' days ' ELSE '' END +
    CASE WHEN @hours > 0 THEN CAST(@hours as varchar) + ' hours ' ELSE '' END +
    CASE WHEN @minutes > 0 THEN CAST(@minutes as varchar) + ' minutes ' ELSE '' END + 
    CASE WHEN @seconds > 0 THEN CAST(@seconds as varchar) + ' seconds ' ELSE '' END)
END
GO
Run Code Online (Sandbox Code Playgroud)