将 TIME 与 DURATION 存储为两种不同的类型

Storing TIME vs DURATION as two separate types

大多数数据库有两种不同的数据类型来表示 TIME(范围是 0 到 24h)和 DURATION,其中范围比那个长得多。

我的问题是为什么这里必须有两种不同的类型,为什么不能像 VARCHAR 那样处理它,也就是说,“时间”就像DURATION(24) 和“持续时间”可能类似于 DURATION(24*7*365)。这两种类型需要不同的主要原因是什么,而不是在它可能具有的域或值范围上有类似 check/restraint 的东西?

我相信mysql没有duration(只是时间),postgres两者都有,sqlserver也没有duration类型(同样只是一个 time 和其他各种 date/time)。

My questions is why is it necessary for there to be two different types here

因为它们是两个不同的东西。 time 是绝对的“一天中的时刻”,例如“晚上 8 点”或“凌晨 3 点”。

interval(=持续时间)类似于“2 个月 3 天 10 小时 15 分 42 秒”- 无法表示为 time.[=25= 的值]

interval类型还有一个存在的理由:它也可以正确表达两个时间戳之间的差异。

理论上,任何可以用 time 值表达的东西也可以用 interval 表达。实际上 timestamp 也不是必需的,因为每个时间戳也可以根据您定义的开始日期表示为 interval

但是如果您删除所有与其他类型“重叠”的类型,则您也需要删除其他类型。 floatdouble 总是可以用 numeric 值表示。事实上 numeric 值也可以表示为一个非常大的整数值,所以为什么要保留数字。

对不同的事物使用不同的数据类型的主要原因主要是效率和验证。但它也有助于理解您的数据模型并提高表现力 - 如果它是 interval 知道 通过查看它代表“持续时间”的列的类型,如果它是 time 列你 知道 它代表一个“时刻”。您无需先查阅为该列定义的检查约束即可看到这一点。