存储星期几和时间?

2024-03-10

我有一个关于在数据库中存储星期几和时间的两部分问题。我正在使用 Rails 4.0、Ruby 2.0.0 和 Postgres。

我有某些活动,并且这些活动都有时间表。例如,对于“跳伞”活动,我可能会在周二、周三和下午 3 点进行。

  1. 有没有办法让我将星期二和星期三的记录存储在一行中,或者我应该有两条记录?
  2. 存储日期和时间的最佳方式是什么?有没有办法存储星期几和时间(不是日期时间)或者它们应该是单独的列?如果它们应该分开,我将如何存储星期几?我正在考虑将它们存储为整数值,0 表示星期日,1 表示星期一,因为这就是wdayTime 类的方法可以做到这一点。

任何建议都会非常有帮助。


有没有办法让我存储星期二和 星期三连续还是我应该有两条记录?

有多种方法可以在一行中存储多个时间范围。 @bma 已经提供了其中几个。这可能有助于通过非常简单的时间模式节省磁盘空间。干净、灵活和“标准化”的方法是存储每个时间范围一行.

存储日期和时间的最佳方式是什么?

Use a timestamp (or timestamptz如果可能涉及多个时区)。选择一个任意“分期”周并在使用日期和时间方面时忽略日期部分timestamp。根据我的经验,这是最简单、最快的,并且所有与日期和时间相关的健全性检查都是自动内置的。我使用的范围以1996-01-01 00:00对于几个类似的应用程序,有两个原因:

  • 一周的前 7 天与该月的某一天一致(对于sun = 7).
  • 同时也是最近的闰年(每年模式为 2 月 29 日)。

量程类型

因为你实际上是在和时间打交道ranges(不仅仅是“日期和时间”)我建议使用内置范围类型tsrange https://www.postgresql.org/docs/current/rangetypes.html (or tstzrange)。一个主要优点:您可以使用内置的军火库范围函数和运算符 https://www.postgresql.org/docs/current/functions-range.html。需要 Postgres9.2 或更高版本.

例如,您可以有一个排除约束在此基础上(通过功能齐全的 GiST 索引在内部实现,可能会提供额外的好处),以排除重叠的时间范围。请考虑此相关答案以了解详细信息:

  • 在 PostgreSQL 中使用 EXCLUDE 防止相邻/重叠条目 https://stackoverflow.com/questions/19504727/preventing-adjacent-overlapping-entries-with-exclude-in-postgresql/19505869#19505869

对于这个特定的排除约束(没有重叠范围每个事件),您需要包含整数列event_id在约束中,所以你需要安装附加模块btree_gist https://www.postgresql.org/docs/current/btree-gist.html。每个数据库安装一次:

CREATE EXTENSION btree_gist;  -- once per db

或者你可以有一个简单的CHECK约束使用“范围包含于”运算符来限制允许的时间段<@.

可能看起来像这样:

CREATE TABLE event (event_id serial PRIMARY KEY, ...);

CREATE TABLE schedule (
   event_id integer NOT NULL REFERENCES event(event_id)
                    ON DELETE CASCADE ON UPDATE CASCADE
 , t_range  tsrange
 , PRIMARY KEY (event_id, t_range)
 , CHECK (t_range <@ '[1996-01-01 00:00, 1996-01-09 00:00)')  -- restrict period
 , EXCLUDE USING gist (event_id WITH =, t_range WITH &&)      -- disallow overlap
);

对于每周计划,请使用前 7 天、周一至周日或任何适合您的时间。以类似的方式制定每月或每年的时间表。

如何提取星期几、时间等?

@CDub 提供了一个模块 https://stackoverflow.com/a/19895268/939860在 Ruby 端处理它。我无法对此发表评论,但您也可以在 Postgres 中完成所有操作,并且性能无可挑剔。

SELECT ts::time AS t_time           -- get the time (practically no cost)
SELECT EXTRACT(DOW FROM ts) AS dow  -- get day of week (very cheap)

或者对于范围类型以类似的方式:

SELECT EXTRACT(DOW FROM lower(t_range)) AS dow_from  -- day of week lower bound
     , EXTRACT(DOW FROM upper(t_range)) AS dow_to    -- same for upper
     , lower(t_range)::time AS time_from             -- start time
     , upper(t_range)::time AS time_to               -- end time
FROM   schedule;

db<>fiddle
Old sqliddle http://sqlfiddle.com/#!17/47d8b/2

ISODOW代替DOW for EXTRACT() https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT回报7代替0周日。您可以提取一长串内容。

此相关答案演示了如何使用范围类型运算符来计算时间范围的总持续时间(最后一章):

  • 计算 PostgreSQL 中 2 个日期之间的工作时间 https://stackoverflow.com/questions/1839319/calculate-working-hours-between-2-dates-in-postgresql/17282639#17282639
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

存储星期几和时间? 的相关文章

随机推荐

  • “<-”是否意味着在Haskell中分配变量?

    刚开始Haskell 据说Haskell中除了IO包之外的所有东西都是 不可变的 那么当我将名称绑定到某个东西时 它总是不可变的 问题 如下 Prelude gt let removeLower x c c lt x c elem A Z
  • Web API 序列化从小写字母开始的属性

    如何配置要使用的 Web API 的序列化camelCase 从小写字母开始 属性名称而不是PascalCase就像 C 中一样 我可以在整个项目的全球范围内进行吗 如果您想更改 Newtonsoft Json 又名 JSON NET 中的
  • 为重复的索引值添加后缀

    这是一个 df 0 01 0 029064 0 01 0 032876 0 01 0 040795 0 02 0 027003 0 02 0 0315 需要将其与另一个框架连接 但出现错误 无法从重复轴重新索引 我想要的是这样的 df 0
  • vs2015不断添加project.lock.json到tfs

    我的文件夹结构是 解决方案文件夹 tfignore 文件 每个项目的文件夹 但 vs2015 继续将我的 project lock json 文件包含在源代码管理中 在我的 tfignore 文件中 我添加了 project lock js
  • C 中的 case 标签不会减少为整数常量?

    我正在开发一个游戏 我运行了我的代码并收到错误 case 标签不会减少为整数常量 我想我知道这意味着什么 但是我该如何解决它呢 这是我的代码 include
  • 如何将列表列表从宽变为长

    我有一个具有共同结构的列表列表 require data table l lt list a1 list b data table rnorm 3 c data table rnorm 3 d data table rnorm 3 a2 l
  • C++ 与 Python 精度

    尝试查找 num num 的前 k 位数字的问题我用 C 和 Python 编写了相同的程序 C long double intpart num f digit k cin gt gt num gt gt k f digit pow 10
  • 元组比较

    我有一本定义如下的字典 d date tuple date open tuple open close tuple close min tuple min max tuple max MA tuple ma 这些元组中的每一个都包含一个值列
  • 在 iOS 中实现 Google 自定义搜索 API

    我浏览了几个链接 以便找到在 ios 应用程序中实现 google customsearchapi 的正确步骤 并在此过程中花费了大约 6 7 个小时 Links https developers google com custom sea
  • 模型的 flow_from_directory 拟合产生 ValueError:输入 0 与图层模型不兼容

    我有以下模型 我尝试使用 ImageDataGenerator 与 flow from directory 和 fit generator 来拟合模型 但是出现以下错误 ValueError Input 0 is incompatible
  • 在 Swift 中接收 Websocket 数据

    我继续这个从这个问题 https stackoverflow com questions 65988137 how do i send a dictionary to a client using vapor websockets 6598
  • 如何使用React hooks和react-router执行身份验证

    我正在尝试在每次路线更改时对用户进行身份验证react router dom and react hooks 这个想法是 每次用户导航到某个路线时 系统都会进行 api 调用并对用户进行身份验证 我需要实现这一目标 因为我使用react r
  • 指令单击外部角度 6

    我将 Angular 从 4 升级到 6 因此我的点击策略出现了问题 它停止在所有组件上工作 我的指令 import Directive Output EventEmitter ElementRef HostListener from an
  • 如何将 jQuery 与 amp-script 一起使用?

    AMP 文档提到将 jQuery 与 amp script 组件一起使用 https amp dev documentation guides and tutorials develop custom javascript https am
  • 在 WPF 中创建侧边栏 - 像 Windows 桌面应用程序一样的弹出窗口

    我想做的是在 WPF 中创建一个桌面应用程序 其 UI 是这样的 一个小图标将保持固定在屏幕左边缘的中心 单击 或悬停 时将滑动打开一个侧边栏 如谷歌 桌面栏 沿着屏幕左边缘运行 固定位置 无法移动 请注意 我要求的可能类似于应用程序栏 但
  • 如何让 Bower 构建包?

    有没有办法让 Bower 在从 GitHub 克隆后运行包 grunt 我正在尝试使用 Bower 但我使用的软件包之一是 Bootstrap 扩展 x editable 问题是 虽然其他软件包将完整构建的版本推送到 github 所以当
  • AWS with .NET - 从 CloudWatch 读取日志 - 没有返回日志数据

    我正在尝试使用 NET 从 CloudWatch 读取使用 SNS 发送的消息的日志数据 从 CloudWatch 控制台 CloudWatch CloudWatch Logs Logs Insights 我输入 Date range cu
  • unity3d中的屏幕录制

    unity如何进行屏幕录制 我想在运行游戏时录制屏幕 游戏玩法 那应该是 play stop replay 从设备本地保存录音 从我的设备打开 加载 我们已经录制了 在我的游戏中 一台可以捕获本机相机的相机和一台 3D 模型 我希望记录两者
  • 原则 2 没有要处理的元数据类

    我已经将 zf 1 与原则 2 集成 我通过以下方式创建了实体 phpology php orm convert mapping force from database 注释 C wamp www ip application models
  • 存储星期几和时间?

    我有一个关于在数据库中存储星期几和时间的两部分问题 我正在使用 Rails 4 0 Ruby 2 0 0 和 Postgres 我有某些活动 并且这些活动都有时间表 例如 对于 跳伞 活动 我可能会在周二 周三和下午 3 点进行 有没有办法