【问题标题】:Duration data type in TimeIntervalDto objectTimeIntervalDto 对象中的持续时间数据类型
【发布时间】:2020-03-17 00:14:52
【问题描述】:

我正在创建一个数据库来存储在 Clockify 中创建的时间条目,我需要为持续时间字段声明一个数据类型。 TimeIntervalDto 中返回一个字符串,API 文档中提供的示例是“PT1M4S”或“PT1H30M15S”。如果您知道如何解码,这显然是一个有意义的字符串。

API 文档中给出的示例是:

“时间间隔”:{ “持续时间”:“PT1M4S”,(例如:PT1H30M15S - 1 小时 30 分 15 秒) “结束”:“2018-06-12T14:01:41Z”, “开始”:“2018-06-12T14:00:37Z” },

我的问题是:

  1. 如何将持续时间转化为有意义的东西;和
  2. 假设我使用 varchar 或 nvarchar 作为数据类型,我需要满足的最大大小是多少?

【问题讨论】:

    标签: clockify


    【解决方案1】:

    您正在使用 ISO 8601:2004(en) 持续时间 ISO 格式。

    您有如下模式:“PnnYnnMnnDTnnHnnMnnS”

    详细说明:

    • 字母 P 表示句点格式
    • 每个字母代表一个不同的值,例如,如果您想表示两年,请使用 02Y。
    • 小时数使用字母 T。

    所以对于你的问题:

    如果您可以在保存到数据库之前使用 C# 语言,您可以使用以下方式解码 de 模式:

     String pattern = "PT1H30M15S";
     TimeSpan ts = System.Xml.XmlConvert.ToTimeSpan(pattern); //Use System.Xml because it works with ISO 8601:2004
    

    您可以在 ISO 网页中查找更多信息。 https://www.iso.org/obp/ui/#iso:std:iso:8601:ed-3:v1:en

    【讨论】:

    • 谢谢您的解释
    【解决方案2】:

    如果您使用的是 Postgres 数据库,则可以基于结束列和开始列创建新列。因此,您不需要仅在持续时间内创建新列,因为它已经隐含在其他两列中。

    如果您想获得持续时间,您可以执行以下查询:

    SELECT (t.end - t.start) as "duration", t.start, t.end from t
    

    这将为您返回一个 interval 类型的新列“duration”。


    如果你真的想创建一个新列,你可以做一个 SQL 触发器来填充类型为 interval 的列“duration”,每次有新条目时使用“start”和“end”列添加到表格中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 2020-05-20
      • 2014-08-03
      相关资源
      最近更新 更多