预订表中仅允许工作时间

2024-04-16

PostgreSql 9.2 保留表定义为

CREATE EXTENSION btree_gist;
CREATE TABLE schedule (
  id serial primary key,
  during tsrange not null,
  EXCLUDE USING gist (during WITH &&)
);

假期见表

CREATE TABLE holiday ( day primary key );

工作日工作时间为 8:00 至 18:00,且只能以 30 分钟为间隔进行预订。 如何向 while 值添加约束,以便仅允许在工作时间进行预订:

  1. tsrange 中的开始日期和结束日期始终相同。
  2. 开始和结束日期不能是星期六和星期日
  3. 开始和结束日期不能出现在公共假期表中
  4. 开始时间只能为 8:00、8:30、9:00、9:30、... 16:00、16:30、17:00 或 17:30(含)
  5. 结束时间只能为 8:30、9:00、9:30、... 16:00、16:30、17:00、17:30 或 18:00(不含)

将这些或其中一些约束添加到该表中是否合理? 如果有,如何添加? 如果有帮助的话,可以更改计划表结构。


除了第3项之外,你可以用简单的方法解决所有问题CHECK限制条件 https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-CHECK-CONSTRAINTS:

使用专用范围函数 lower(anysrange) and upper(anyrange) https://www.postgresql.org/docs/current/functions-range.html#RANGE-FUNCTIONS-TABLE访问范围的下限/上限。

1.) tsrange 中的开始日期和结束日期始终相同。

CONSTRAINT schedule_same_day
CHECK (lower(during)::date = upper(during)::date)

2.) 开始和结束日期不能是周六和周日

Use isodow, not dow https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT为了更简单的表达。

CONSTRAINT schedule_no weekend
CHECK (EXTRACT(ISODOW FROM lower(during)) < 6)  -- upper is on same day

3.) 开始和结束日期不能出现在公共假期表中

为此你需要一个trigger like:

CREATE OR REPLACE FUNCTION trg_during_no_holy()
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
   IF EXISTS (SELECT FROM holiday WHERE day = lower(NEW.during)) THEN
      RAISE EXCEPTION 'Day too holy: %', lower(NEW.during);
   END IF;

   RETURN NEW;
END
$func$;

CREATE TRIGGER insupbef_holycheck
  BEFORE INSERT OR UPDATE
  ON schedule
  FOR EACH ROW
  EXECUTE PROCEDURE trg_during_no_holy();

4.) 开始时间只能为 8:00、8:30、9:00、9:30、...、16:00、16:30、17:00 或 17:30(含)。
5.) 结束时间只能是 8:30、9:00、9:30、...、16:00、16:30、17:00、17:30 或 18:00(不含)。

CONSTRAINT schedule_8_inc_to_18_exc_half_hours CHECK (
        lower(during)::time BETWEEN time '8:00'AND time '17:30' -- time range
    AND upper(during)::time BETWEEN time '8:30'AND time '18:00'
    AND EXTRACT(MINUTE FROM lower(during)) IN (0, 30) -- only :00 or :30
    AND EXTRACT(MINUTE FROM upper(during)) IN (0, 30)
    AND lower_inc(during)          -- lower bound always incl.
    AND upper_inc(during) = false  -- upper bound always excl.
   )

更新:在Postgres 14或较新的用途date_bin():

CONSTRAINT schedule_8_inc_to_18_exc_half_hours CHECK (
       lower(during) < upper(during)
   AND lower(during)::time >= time '08:00'
   AND upper(during)::time <= time '18:00'
   AND during = date_bin('30 min', during, '2000-01-01')  -- only :00 or :30 exactly
   AND lower_inc(during)          -- lower bound always incl.
   AND upper_inc(during) = false  -- upper bound always excl.
   )

这也强制执行您的附加要求“限制秒和小数秒”.

See:

  • 在 Postgres 中将时间戳截断为 5 分钟的最快方法是什么? https://stackoverflow.com/questions/7299342/what-is-the-fastest-way-to-truncate-timestamps-to-5-minutes-in-postgres/75160734#75160734
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预订表中仅允许工作时间 的相关文章

  • 如何对 SQL 查询进行单元测试?

    我有课DBHandler它接受一个查询 通过 SQL Server 运行它 检查错误并返回结果 我如何对这个类进行单元测试 Edit 我会尽量说得更准确 DBHandler负责将查询传递到服务器 为了测试它是否确实做到了这一点 抛出正确的异
  • SQL Server 2008 排序规则冲突 - 如何解决?

    为了简化 POC 我使用字符类型列进行以下查询 select AH NAME1 from GGIMAIN SYSADM BW AUFTR KOPF union select AH NAME1 from GGI2014 SYSADM BW A
  • 如何在 Postgres 中对包含语义版本的列进行排序

    有没有办法高效存储https semver org https semver orgPostgres 中的版本字符串 然后执行最新查询 例如假设列的值为 1 1 0 1 0 0 1 2 0 1 0 1 rc 1 B001 我想排序并获取最新
  • Bigtable数据库设计理论

    我非常精通关系数据库设计的理论和实践 我知道什么有效 什么无效 什么是高性能的 什么是可维护的 几乎 当您开始拥有真实数据时 总是有需要调整的地方 看来我找不到关于分布式可扩展数据库的大量知识 例如 Google 的 Bigtable 用于
  • 如何在sql server中获取从当前日期时间到过去7天的过去7天的数据

    您好 我正在使用 pentaho 将表 A 数据从 sql server 加载到 mysql 加载数据时 我只需要从 sql server A 表获取最近 7 天的数据到 mysql 在sql server中createddate列数据类型
  • 如何在 postgresql 的“tablefunc”查询中包含空值?

    我正在尝试使用crosstab http www postgresql org docs 9 1 static tablefunc html函数于postgresql创建一个pivot table 但是 我很难理解如何在查询中构建 SQL
  • 使用 \PDO::ATTR_EMULATE_PREPARES => true 时出现 Laravel 数据不匹配错误

    我们在 Php Laravel 中构建了应用程序 对于数据库我们使用 postgres sql 此外 在 postgres 之上 我们还配置了 pgBouncer 通过管理可供任何应用程序使用的空闲连接池来限制服务器端的最大连接数 现在 我
  • 如何选择非“唯一”行

    我有下表 我必须从中获取非唯一行 id idA infos 0 201 1899 1 205 1955 2 207 1955 3 201 1959 我想获取该列的所有行infos 具有相同的idA至少有两行的值 上表的查询输出必须是 inf
  • 如何在 Django ORM 中更改 PostgreSQL 的默认空排序行为

    默认情况下 PostgreSQL 将 NULL 值视为最高值 因此对于降序查询 首先对它们进行排序 对于升序查询 最后对它们进行排序 您可以通过指定 NULLS LAST 或 NULLS FIRST 在每个查询或创建索引时修改此行为 如何将
  • Postgresql - 确定从级联删除中删除哪些记录

    我继承了一个相当大的 postgresql 数据库 我们有一个每月运行的作业 用于备份现有数据库并使用我们收到的更新的供应商数据创建一个新数据库 目前有一个小问题 在不深入了解表设置 数据建模内容等细节的情况下 我相信它可以通过简单的删除查
  • 创建数据库索引的最佳实践和“经验法则”有哪些?

    我有一个应用程序 它循环访问数据库表中的大量记录 并对该数据库中的记录执行大量 SQL 和 Net 操作 目前我在 PostgreSQL 上使用 Castle ActiveRecord 我在几个字段上添加了一些基本的 btree 索引 正如
  • 比较字符串结尾的最佳方法是使用 RIGHT、LIKE 还是其他?

    我需要将字符串的结尾与存储过程中可能的结尾列表进行比较 会被叫很多 大概有10 15个候选结局 此时 仅使用代码的解决方案比创建专用于此的表更好 类似的东西 IF ENDSWITH var foo OR ENDSWITH var bar O
  • 在没有条件的情况下,如何使查询不返回任何内容?

    相当简单 我有一对多 多对一关系 我想查询它 但是 当未提供任何 WHERE 子句信息时 我不希望返回任何结果 简单来说 如何使查询变得非贪婪 您可以添加一个始终为 false 的 where 子句 并附加您想要用 OR 提供的条件 sel
  • 在任何 PostgreSQL 语句(甚至不返回结果的语句)上调用 row_to_json(row)

    我正在寻找始终从 PostgreSQL 语句返回 JSON 表示的查询 即使没有returning 这是一个例子 WITH result AS insert into users name age values drew 42 select
  • Oracle SQL:从表中选择数据和分区名称并截断分区

    这是一个由两部分组成的问题 1 是否可以根据数据所在的分区使用 select 语句检索其名称ROWID或者其他一些标识符 eg SELECT DATA ID CATEGORY VALUE PARTITION NAME FROM MYTABL
  • 无法绑定多部分标识符

    我在 SO 上看到过类似的错误 但我找不到解决我的问题的方法 我有一个 SQL 查询 例如 SELECT DISTINCT a maxa b mahuyen a tenxa b tenhuyen ISNULL dkcd tong 0 AS
  • Oracle BLOB 与 VARCHAR

    我需要在表的一列中存储一个 大 SQL 查询 我想使用BLOB场地 需要明确的是 我想存储查询 而不是其结果 最好使用什么 BLOB or a VARCHAR 或者也许还有别的什么 另一种选择是 CLOB 对于文本数据 使用 CLOB 比使
  • 如何根据某些条件跳过 MSSQL 游标中的一行(迭代)?

    如何根据某些条件在 MSSQL 游标中跳过一行 迭代 我有一个可迁移数千条记录的 DTS 并且根据某些条件 某些记录不需要迁移 因为它们是重复的并且想要跳过这些记录 知道如何在 MSSQL Cursor 中完成此操作吗 我想最简单的方法是在
  • 查询 ssisdb 以查找包的名称

    我正在查询 ssis 目录以找出目录中所有包的名称 Folder1项目中只有6个包 但查询却给出了9条记录 1 SELECT P NAME FROM SSISDB internal projects PRJ INNER JOIN SSISD
  • 将列从日期转换为日期时间

    我有一个名为Lastmodified 数据类型为Date 但本来应该是DateTime 有没有办法转换列 当我使用 SQL Server Management Studio 的 设计 功能时 出现以下错误 不允许保存更改 您所做的更改需要以

随机推荐

  • 在 iOS 5 中播放视频

    我正在尝试遵循本教程link http www techotopia com index php Video Playback from within an iOS 5 iPhone Application 但我有问题 有人可以看一下并让我
  • oracle pl/sql中的XML解析

    我正在尝试在 PL SQL 中解析此 XML
  • 在 WHERE 中使用 ROW_NUMBER() 别名[重复]

    这个问题在这里已经有答案了 在 Postgresql 9 1 中 我尝试使用 ROW NUMBER 别名字段过滤 WHERE 子句中的结果集 这个查询工作正常 SELECT inv client pk inv invoice pk inv
  • 监听来自UIWebView的所有请求

    我可以使用以下方法拦截来自 UIWebView 的初始加载请求 BOOL webView UIWebView webView shouldStartLoadWithRequest NSURLRequest request navigatio
  • 在 Javascript 中声明函数最有效的方法是什么?

    我一直了解到 要在 javascript 中声明函数 您应该执行以下操作 function myfunction fruit alert I like fruit 或类似的东西 var myfunction function fruit a
  • 如何获取子 ng-repeat 内父作用域数组/ng-repeat 的索引

    我正在建一张桌子 我有两张桌子ng repeat为了我的桌子 我的问题是 这是否有可能是ng repeat可以得到父级ng repeat的索引 例如 tbody tr td company the company index and pro
  • 为什么 Google 的 OpenID 实现的 ID 会发生变化?

    我正在尝试为 Web 应用程序实现 OpenId 登录 每当新用户通过 OpenId 登录时 我都会在系统上创建一个新用户 并在数据中存储他们的 openid URL 以便下次他们使用该用户登录时 我正在使用 Gmail OpenID 对此
  • 如何为armv6、armv7和i386编译静态库(fat)

    我知道这个问题已经被提出过好几次了 但我的目标与我在网上搜索到的内容略有不同 具体来说 我已经能够为 iPhone 构建静态库 但我能够构建的最终 fat 文件仅包含arm和i386架构 并且我不确定arm指的是 v6还是v7 我无法专门针
  • C++ 中谓词是什么? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 您能举一些例子或主题链接吗 谓词是一
  • Jquery中的onclick函数不起作用

    在product showcase js 文件的帮助下 我将内容加载到 HTML 中 然后使用以下类单击产品链接即内在我正在尝试组织一个单击事件如product description js所示 数据是从 json 文件中获取的 我能够将数
  • 将照片上传到 MVC 4 应用程序

    我正在尝试创建一个控制器来在我的 MVC4 应用程序中上传照片 但我不断收到此错误 输入不是有效的 Base 64 字符串 因为它包含非 Base 64 字符 两个以上的填充字符或填充字符中包含非空白字符 照片控制器 cs public c
  • 使用 php 客户端库 v3 将视频上传到 youtube

    我正在尝试使用客户端库 v3 将视频上传到 youtube v3 库是实验性的 没有太多文档 提供的示例不包括 youtube 我已经使用 oauth 2 0 正确验证了用户身份 当我拥有访问令牌时 我正在尝试使用此代码 if client
  • 如何根据给定名称查找一个类的所有子类?

    我需要一种获取从 Python 基类继承的所有类的工作方法 新式类 即从object 这是 Python 3 中的默认设置 subclasses 返回子类的方法 class Foo object pass class Bar Foo pas
  • Xcode 4模板,创建空组

    我正在尝试创建一个 xcode 4 模板 除了我无法创建空组之外 一切工作正常 我想要这个项目结构 项目名 楷模 控制器 景观 服务
  • 检查字典的任何值是否与条件匹配[重复]

    这个问题在这里已经有答案了 python程序员如何检查字典的任何值是否匹配条件 大于0就我而言 我正在寻找对性能影响最小的最 Pythonic 方式 我的字典 pairs word1 0 word2 0 word3 2000 word4 6
  • 在不改变目标类型的情况下以最高精度序列化浮点数

    我需要反序列化原始二进制数据 BinaryFormatter 然后序列化为 JSON 用于编辑 然后再次将其序列化回二进制 显然 我输在了浮动上 原始浮点值0xF9FF4FC1 大端 大致 12 9999933 四舍五入为0xF6FF4FC
  • 通过代码在LinearLayout中对齐Imageview

    问题很简单 我正在使用代码动态创建一个图像视图 ImageView btnSend new ImageView this 并将其添加到 LinearLayout 中 问题是我想保持右对齐 怎么做 提前致谢 尝试使用 LayoutParams
  • 使用每行的列索引向量提取矩阵元素

    我有一个MxN矩阵 我想要一个列向量v 使用向量s它告诉我对于矩阵中的每一行我将采用哪一列 这是一个例子 Matrix 4 13 93 20 42 31 18 94 64 02 7 44 24 91 15 11 20 43 38 31 21
  • 指数代码,我不理解代码行为

    这是指数计算的代码 var exponent function a n if n 0 return 1 else return a exponent a n 1 console log exponent 5 3 我不明白这一行 return
  • 预订表中仅允许工作时间

    PostgreSql 9 2 保留表定义为 CREATE EXTENSION btree gist CREATE TABLE schedule id serial primary key during tsrange not null EX