AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 78063
Accepted
Federico Ponzi
Federico Ponzi
Asked: 2014-10-01 09:09:53 +0800 CST2014-10-01 09:09:53 +0800 CST 2014-10-01 09:09:53 +0800 CST

如何在postgresql中保存年限

  • 772

我必须保存几年的时间间隔,例如:

id intervalYears
1  2014/2015
2  2015/2016
3  2016/2017

等等。这些年就像学年,所以第一年必须小于第二年,但大于或等于实际年份。

那么,如何保存这个数据类型呢?我应该分开日期并添加一些约束吗?

postgresql datatypes
  • 2 2 个回答
  • 1026 Views

2 个回答

  • Voted
  1. Best Answer
    Craig Ringer
    2014-10-01T19:05:33+08:002014-10-01T19:05:33+08:00

    如果可能,只存储第一个值

    看起来您根本不需要存储两个数字。

    如果这些类似于纳税年度,即“2014/2015 财政年度”,您只需始终如一地存储一部分。

    如果您存储2014,您的应用程序就会知道这是从 2014 年开始的学年。所以它可以毫无歧义地显示“2014/2015学年”。

    如果你真的需要一个范围

    如果您确实需要范围并且您的样本数据没有表达这一点,例如您可能需要存储2012/2015,那么两int2列将是一个不错的选择。正如@Neil 已经展示的那样,您将使用CHECK约束将范围限制为一个学年的合理值,并强制要求下限小于上限。

    或者,您可以使用新的 ish 和特定于 PostgreSQL 的int4range类型:

    SELECT int4range(2014, 2015);
    

    根据范围类型的文档。这为您提供了更多的运算符,但代价是在处理基本查询和客户端应用程序时变得更加繁琐。

    您甚至可以DOMAIN对其进行改造以限制其范围。

    CREATE DOMAIN academicyearrange AS int4range 
      CONSTRAINT must_be_sane_year 
      CHECK ( lower(VALUE) BETWEEN 1900 AND 2100 
          AND upper(VALUE) BETWEEN 1900 AND 2100 );
    

    例如

    regress=> SELECT '[1421,2247)'::academicyearrange;
    ERROR:  value for domain academicyearrange violates check constraint "must_be_sane_year"
    
    regress=> SELECT int4range(1421,2247)::academicyearrange;
    ERROR:  value for domain academicyearrange violates check constraint "must_be_sane_year"
    

    (在范围类型之前,我会建议在复合类型上使用域,但int4range在各个方面都比复合类型好)。

    很可能所有这些都是不必要的 - 如果您不需要可变长度范围,即它总是 someyear/thenextyear,您应该只存储第一年。

    • 5
  2. Neil McGuigan
    2014-10-01T16:32:21+08:002014-10-01T16:32:21+08:00

    您可以使用两smallint列:

    create table foo (
      from_year smallint not null,
      to_year smallint not null,
    
      check (from_year = to_year - 1 and from_year >= extract(year from current_date)),
      unique (from_year, to_year)
    );
    
    insert into foo values (2014,2015);
    
    • 2

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve