Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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 Server:存储时间的最佳方式(无日期)_Sql_Sql Server - Fatal编程技术网

SQL Server:存储时间的最佳方式(无日期)

SQL Server:存储时间的最佳方式(无日期),sql,sql-server,Sql,Sql Server,为了完美起见,这里多多少少有一个 Microsoft SQL Server仅包含用于存储日期和时间的字段类型datetime 但假设我想存储一个营业时间列表,其中日期完全不相关。目前我使用的是datetime类型,然后只显示数据的时间部分。但我有两个问题 这似乎效率低下得令人尴尬 它可能会让未来的开发人员感到困惑,因为他们可能不知道是否在任何地方使用了完整的日期和时间 因此它回避了这个问题;如果没有特定的时间字段(如MySQL),那么仅存储一天中特定时间(从00:00到23:59)的最佳方式是什

为了完美起见,这里多多少少有一个

Microsoft SQL Server仅包含用于存储日期和时间的字段类型
datetime

但假设我想存储一个营业时间列表,其中日期完全不相关。目前我使用的是
datetime
类型,然后只显示数据的时间部分。但我有两个问题

  • 这似乎效率低下得令人尴尬
  • 它可能会让未来的开发人员感到困惑,因为他们可能不知道是否在任何地方使用了完整的日期和时间
  • 因此它回避了这个问题;如果没有特定的
    时间
    字段(如MySQL),那么仅存储一天中特定时间(从00:00到23:59)的最佳方式是什么


    更新:这是SQL Server 2005。(另外,我只想知道在没有
    时间
    类型的情况下通常应该做什么。)

    SQL Server 2008有一个
    时间
    数据类型:


    升级到SQL 2008?

    适用于SQL Server 2005或更早版本…

    如果您只想知道一分钟,可以将其存储为
    1-1440
    范围内的int<代码>1是00:01,
    1440
    0:00

    如果您愿意,很容易再次显示为时间:

    选择CAST((605/60)作为varchar)+':'+右('0'+CAST((605%60)作为varchar),2)

    这样做的另一个好处是,如果使用
    smallint
    数据类型,则可以从内置的
    TIME
    数据类型中为每条记录节省1-3个字节

    TIME
    每行使用3-5个字节,
    smallint
    每行使用2个字节

    我相信额外的字节是秒和分数秒

    编辑

    这是更复杂的秒,但仍然可行,我应该认为

    1-86400范围(每天秒)


    P>个人认为,我不认为这些论点足够足以避免使用DATESTIME或SMODEDATEDATION。

    • INT和SMALLDATETIME使用4个字节
    • 人们在使用SMALLINT时出错,导致隐式类型转换(增加cpu负载)
    • 磁盘空间很便宜,您需要大量字节才能添加到任何重要内容
    • 与时间<12:00'
    • 显示问题(如DATETIME到hh:mm的转换)通常是客户端中的最佳位置
    • 使用DATETIME允许将来的灵活性,例如移动到秒而不是分钟
    也就是说,我使用了整数字段来保存秒数,比如当它们主要用于计算平均持续时间时,等等


    在选择类型时,我最大的考虑是如何使用值;确保代码清晰易读并执行计划。

    SQL 2008修复了此问题,正如其他人所指出的,但在2005年:

    你需要在《泰晤士报》上计算日期吗?如果不是,则可以将其存储为字符串

    如果您需要执行日期数学,那么将日期设置为零的datetime以及描述性列名不应该妨碍任何未来的开发人员(感谢您记住我们)


    是的,datetime对于纯时间存储来说很笨重,但它的功能还不错。

    这是SQL Server 2008还是更高版本(交叉手指),因为这样你就可以使用时间数据类型了。SQL Server 2008+有一个时间数据类型:SQL Server在2008年引入了一个数据类型。这目前只适用于
    SQL Server 2008
    。@JNK true,但作者并没有指定版本要求。我知道,但在这些情况下,您只需要确保对其进行限定。如果未指定版本,但您的解决方案是特定于版本的,请在回答中提及。有趣。如果我想要小时、分钟和秒,你知道吗?我会使用范围
    0到n-1
    ;午夜通常被认为是一天开始时的第一个瞬间,而不是一天结束时的最后一个瞬间。(这取决于具体情况,但根据我的经验,这是非常正常的。)@Dems-范围实际上与逻辑无关,但非常重要。如果您关心的是未来的维护,那么这是一个糟糕的解决方案。完整的日期时间将更加明显。我只会在需要的时候使用它。@Helgi-很高兴能提供帮助,感谢您编辑答案,以澄清对您有用的内容。+1-所有这些都是非常有效的分数。我关于答案中字节的观点可能与我的个人经历有关。我有很多非常大(600m-2b行)的表,如果我能将每行的字节数减少几字节,它就会很快累加起来。非常正确,但有一个强有力的论据认为,即使4GB也相对较小。+1 SQL Server 2005已经有了“生命的尽头”—肯定是升级的时候了!你知道它是如何与商业的、封闭源代码的软件一起工作的!在您必须升级之前,拥有成本并不重要。;)
    DECLARE @dt as TIME
    SET @dt = getdate()
    PRINT @dt
    
    DECLARE @i INT
    SET @i = 3661
    
    SELECT RIGHT('0' + CAST((@i / 3600) as varchar),2) --hours
    + ':' + RIGHT('0' + CAST((@i % 3600)/60 as varchar), 2) -- minutes
    + ':' + RIGHT('0' + CAST((@i % 3600)%60 as varchar), 2) -- seconds