{"kind": "type", "slug": "int8range", "name": "int8range", "major": "18", "snapshot": {"casts": [{"castfunc": "int8multirange(int8range)", "castmethod": "f", "castsource": "int8range", "casttarget": "int8multirange", "castcontext": "e"}], "facts": [{"label": "目录名称", "value": "pg_catalog.int8range"}, {"label": "类型 OID", "value": "3926"}, {"label": "类型种类", "value": "范围"}, {"label": "声明长度", "value": "变长（varlena）"}, {"label": "存储策略", "value": "扩展"}, {"label": "输入函数", "value": "range_in"}, {"label": "输出函数", "value": "range_out"}], "ranges": [{"rngtypid": "int8range", "rngsubopc": "btree/int8_ops", "rngsubdiff": "int8range_subdiff", "rngsubtype": "int8", "rngcanonical": "int8range_canonical", "rngcollation": "0", "rngmultitypid": "int8multirange"}], "aliases": [], "catalog": {"oid": "3926", "descr": "range of bigints", "typacl": "_null_", "typlen": "-1", "typelem": "0", "typname": "int8range", "typsend": "range_send", "typtype": "r", "typalign": "d", "typarray": "0", "typbyval": "f", "typdelim": "','", "typinput": "range_in", "typmodin": "-", "typndims": "0", "typowner": "POSTGRES", "typrelid": "0", "typmodout": "-", "typoutput": "range_out", "typtypmod": "-1", "typanalyze": "range_typanalyze", "typdefault": "_null_", "typnotnull": "f", "typreceive": "range_recv", "typstorage": "x", "typbasetype": "0", "typcategory": "R", "typcollation": "0", "typisdefined": "t", "typnamespace": "pg_catalog", "typsubscript": "-", "typdefaultbin": "_null_", "array_type_oid": "3927", "typispreferred": "f", "array_type_name": "_int8range"}, "related": [{"url": "/wiki/catalog/pg_type/?v=18", "label": "pg_type 系统目录"}, {"url": "/wiki/catalog/pg_cast/?v=18", "label": "pg_cast 系统目录"}, {"url": "/wiki/catalog/pg_operator/?v=18", "label": "pg_operator 系统目录"}, {"url": "/wiki/catalog/pg_opclass/?v=18", "label": "pg_opclass 系统目录"}, {"url": "/wiki/type/arrays/?v=18", "label": "数组"}], "release": {"ref": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "label": "18.6", "major": "18", "channel": "stable", "revision": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "source_files": {"doc/src/sgml/datatype.sgml": "86328daa77e20d81d222376ec0306d9841a17104e436c08d138eb763aefb3700", "src/include/catalog/pg_am.h": "3426799df799f32163fcc0765f43dbdb5e88e626acf31284fef9fc6014b69d8e", "src/include/catalog/pg_am.dat": "b3cb86b102a42fb0024cbd99779c9897afb40d12a71f5cc5a0e5aee7ff2f9969", "src/include/catalog/pg_cast.h": "de585c7df687d698e7d1d100dce8a794ac9da52414ea48169191019178c8f053", "src/include/catalog/pg_proc.h": "f7d59f07c5b95e2f3c7141762a0f576e8a3af7581ba54c27537f4d500472bea5", "src/include/catalog/pg_type.h": "8fb198749fd82b6c1818a3c18455f226f66116fcfeb3d4959c65ce3fda22802e", "src/include/catalog/pg_range.h": "45546d952b5181f989bd9234721897fc2b37005c8e49ce2ddc156f26974c3ca4", "src/include/catalog/pg_cast.dat": "97911281ca2c81917394ccb2ec13367e37c6801fd461d5e1a3d2f28b911b46b2", "src/include/catalog/pg_proc.dat": "1f934ce80d460159dda137714374a35f9896315ea2476709cbb4da13b38ef95a", "src/include/catalog/pg_type.dat": "5f5887b75677cba2d4a1a0cfeb355df5ed91f85d385fac88bd8d7c605b3578f9", "src/include/catalog/pg_opclass.h": "9c218537806c8ef0398302faaca7f91315dfc1198c48706cebffb479b68defaf", "src/include/catalog/pg_range.dat": "5c2271f8e89e9378d1887204e5785060b77405b5f0ff3e6c719250c9c1dcfcc4", "src/include/catalog/pg_operator.h": "621b18cfffe102413d79b746ce7a10f77fc60fdd097bac34c22b31070d3ee3c4", "src/include/catalog/pg_opfamily.h": "e1f5fc8aebd3042df847455bf66bf755f768c2aa8a9b03d22f7ec8563eba59c0", "src/include/catalog/pg_opclass.dat": "4ee7d3619a6aa106e1c0db55de903931c7d11b1c60ba053a022519c55f8ee668", "src/include/catalog/pg_operator.dat": "5d35b9b2ef5f9797cc815263927ef8a12367fedace53e828b4e8b320e2a7f703", "src/include/catalog/pg_opfamily.dat": "3b694879027b858f2ecf1fa1152b7e30c6e15a216ba99c2384291c30e9d52311"}, "manual_sha256": {"arrays.html": "0e1d5c5a7b4a949d4439995f44f74ad4264e050d16eb9ad2a850fbaee04032df", "domains.html": "82d486973ccc35d14276627a67ac76b434452f23f9ed4d8aa3fbb01fdf285fc2", "datatype.html": "e581f67c74e42006289638c8659e9b338adbfd7f068bd8bf2b3be3880fcd2254", "rowtypes.html": "74f99e029c3a9edfd3e18810ba3c8cb66d3aada91eb67b86476560871e6617e9", "rangetypes.html": "e4960abc7ce8e51d794f94f1e57b099d30b7f75dd7f2b23a960eef91f6291c33", "datatype-bit.html": "c49124aad561636c18080b9e09572fde7785a6b9eae86f5a33283f0fd6774c37", "datatype-oid.html": "8b3360302225f08ae72716ce1804596de95b568e5d31f788cb4597427b28cc38", "datatype-xml.html": "061fc2295b7b69be704f0a741b8decd10ad721059f871fb0243c669bb54d7822", "datatype-enum.html": "cab38e53222e30cc94b24de4b33634fd22d7c93f58ebcf35f646c9b8da78fae8", "datatype-json.html": "650162a05b660146b500a205d523374d00aee117a6a6240d30262be51b6e33e5", "datatype-uuid.html": "292b307b3223c6182bdba687e7f69e6dca9038430143ad79d56327f6ed4c3246", "datatype-money.html": "8b29c14b90679683ac5c472b59a0a7e2853f32cc7db43fab417b2697a6879964", "functions-info.html": "78ac80bf81da2e4f4a33f3b850faa86f0f58ec54a083d6c31da557907de0df87", "catalog-pg-type.html": "ea9c9313bab8e92a7da18ebc50c7ff1f908dd80999a7e0ca3bbc82ba626c58d4", "datatype-binary.html": "0c03ec47b76e37888a3da7f5dcfd340128a5d356642a85185cc9ebe17856a904", "datatype-pg-lsn.html": "339172f5107cc7eb7139bec911277647219e92a532cebd0f3da0a5dacf8195af", "datatype-pseudo.html": "c7cf0b8214304bd8702c95f2142671ae5f0d631f83717f9c07d9e1f2579961b4", "datatype-boolean.html": "b633f663e6c8276e7056287640c413aa79dbc15d5353cee0d41653d58d376956", "datatype-numeric.html": "b74619f7ac2f1ca9f85c48073df78c33dd30e464e61baba6008634534edcb500", "sql-createdomain.html": "e94f927196de1b0ea1ce35cd4603c1f6f544439adcc0edf1c4222358e832245b", "datatype-datetime.html": "e366275d8b13845bfa4ef0d68faa093e5f3ecb708a1ec870cbcbf7e425b85699", "datatype-character.html": "c73eebe413ea709a7792e4cfc3cfe9fb68cb496ebe83c3ebaa9d09f8c40d0f73", "datatype-geometric.html": "0eb3053cfe7d6b0a4b5592c5d7af8d97cae527e87f063c5793413bcba5c14cd9", "datatype-net-types.html": "96846e641cc37727ddcd8b8a1aa0dbe33cd9787760a2b4efb0dcb9403d5be63f", "datatype-textsearch.html": "4b15e05be8b49a71b28aea22f2c46d0dbf639a91e7b4fe129a4c737c6daad47c"}, "source_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, "sources": [{"url": "https://pg.center/docs/18/rangetypes.html", "path": "rangetypes.html", "label": "PostgreSQL 18 English manual", "sha256": "e4960abc7ce8e51d794f94f1e57b099d30b7f75dd7f2b23a960eef91f6291c33", "language": "en", "original_url": "/docs/18/rangetypes.html"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "label": "Matching PostgreSQL source archive", "sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}], "coverage": "source inventory; exact declared input types for operator classes", "sections": [], "operators": [], "signature": "int8range", "description": ["大整数范围"], "manual_html": "<div class=\"sect1\" id=\"RANGETYPES\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\n<div>\n<div>\n<h2 class=\"title\" style=\"clear: both\">8.17. 范围类型 </h2>\n</div>\n</div>\n</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">范围类型是表示某种元素类型的值范围的数据类型（该元素类型称为范围的<em class=\"firstterm\">子类型</em>（subtype））。例如，<code class=\"type\">timestamp</code>的范围可用于表示会议室被预订的时间范围。在这种情况下，数据类型为<code class=\"type\">tsrange</code>（<span class=\"quote\">“<span class=\"quote\">timestamp range</span>”</span>的缩写），而<code class=\"type\">timestamp</code>就是其子类型。子类型必须具有全序，这样才能明确定义元素值是位于某个值范围之内、之前还是之后。</p>\n<p lang=\"zh\">范围类型很有用，因为它们能用单个范围值表示许多元素值，也能清晰地表达诸如范围重叠之类的概念。将时间和日期范围用于日程安排，是最清晰的例子；但价格区间、仪器的测量范围等场景也同样有用。</p>\n<p lang=\"zh\">每种范围类型都有一个对应的多范围类型。多范围是一个有序列表，其中的范围彼此不连续，且均非空、非 NULL。大多数范围操作符也可作用于多范围，并且多范围还有一些专用函数。</p>\n<div class=\"sect2\" id=\"RANGETYPES-BUILTIN\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/rangetypes.html#RANGETYPES-BUILTIN\">8.17.1. 内置范围类型和多范围类型</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">PostgreSQL 自带下列内置范围类型：</p>\n<div class=\"itemizedlist\">\n<ul class=\"itemizedlist\">\n<li class=\"listitem\" lang=\"zh\">\n<p><code class=\"type\">int4range</code> — <code class=\"type\">integer</code>的范围，<code class=\"type\">int4multirange</code> — 对应的多范围类型</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p><code class=\"type\">int8range</code> — <code class=\"type\">bigint</code>的范围，<code class=\"type\">int8multirange</code> — 对应的多范围类型</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p><code class=\"type\">numrange</code> — <code class=\"type\">numeric</code>的范围，<code class=\"type\">nummultirange</code> — 对应的多范围类型</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p><code class=\"type\">tsrange</code> — <code class=\"type\">timestamp without time zone</code>的范围，<code class=\"type\">tsmultirange</code> — 对应的多范围类型</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p><code class=\"type\">tstzrange</code> — <code class=\"type\">timestamp with time zone</code>的范围，<code class=\"type\">tstzmultirange</code> — 对应的多范围类型</p>\n</li>\n<li class=\"listitem\" lang=\"zh\">\n<p><code class=\"type\">daterange</code> — <code class=\"type\">date</code>的范围，<code class=\"type\">datemultirange</code> — 对应的多范围类型</p>\n</li>\n</ul>\n</div>\n<p lang=\"zh\">此外，你还可以定义自己的范围类型；详见<a class=\"xref\" href=\"/docs/18/sql-createtype.html\" title=\"CREATE TYPE\"><span class=\"refentrytitle\">CREATE TYPE</span></a>。</p>\n</div>\n<div class=\"sect2\" id=\"RANGETYPES-EXAMPLES\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/rangetypes.html#RANGETYPES-EXAMPLES\">8.17.2. 示例</a></span></h3>\n</div>\n</div>\n</div>\n<pre class=\"programlisting\">CREATE TABLE reservation (room int, during tsrange);\nINSERT INTO reservation VALUES\n    (1108, '[2010-01-01 14:30, 2010-01-01 15:30)');\n\n-- Containment\nSELECT int4range(10, 20) @&gt; 3;\n\n-- Overlaps\nSELECT numrange(11.1, 22.2) &amp;&amp; numrange(20.0, 30.0);\n\n-- Extract the upper bound\nSELECT upper(int8range(15, 25));\n\n-- Compute the intersection\nSELECT int4range(10, 20) * int4range(15, 25);\n\n-- Is the range empty?\nSELECT isempty(numrange(1, 5));\n</pre>\n<p lang=\"zh\">范围类型上的操作符和函数的完整列表见<a class=\"xref\" href=\"/docs/18/functions-range.html#RANGE-OPERATORS-TABLE\" title=\"表 9.58. 范围操作符\">表 9.58</a>和<a class=\"xref\" href=\"/docs/18/functions-range.html#RANGE-FUNCTIONS-TABLE\" title=\"表 9.60. 范围函数\">表 9.60</a>。</p>\n</div>\n<div class=\"sect2\" id=\"RANGETYPES-INCLUSIVITY\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/rangetypes.html#RANGETYPES-INCLUSIVITY\">8.17.3. 包含界限与排除界限</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">每个非空范围都有两个界限：下界和上界。位于这两个值之间的所有点都包含在该范围内。包含界限表示边界点本身也包含在范围内，而排除界限则表示边界点不包含在范围内。</p>\n<p lang=\"zh\">在范围的文本形式中，包含下界用<span class=\"quote\">“<span class=\"quote\"><code class=\"literal\">[</code></span>”</span>表示，排除下界用<span class=\"quote\">“<span class=\"quote\"><code class=\"literal\">(</code></span>”</span>表示。同样，包含上界用<span class=\"quote\">“<span class=\"quote\"><code class=\"literal\">]</code></span>”</span>表示，排除上界用<span class=\"quote\">“<span class=\"quote\"><code class=\"literal\">)</code></span>”</span>表示。更多细节见<a class=\"xref\" href=\"/docs/18/rangetypes.html#RANGETYPES-IO\" title=\"8.17.5. 范围输入/输出\">第 8.17.5 节</a>。</p>\n<p lang=\"zh\">函数<code class=\"literal\">lower_inc</code>和<code class=\"literal\">upper_inc</code>分别测试范围值的下界和上界是否包含在内。</p>\n</div>\n<div class=\"sect2\" id=\"RANGETYPES-INFINITE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/rangetypes.html#RANGETYPES-INFINITE\">8.17.4. 无限（无界）范围</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">范围的下界可以省略，这意味着所有小于上界的值都包含在范围内，例如<code class=\"literal\">(,3]</code>。同样，如果省略范围的上界，则所有大于下界的值都包含在范围内。如果上下界都被省略，则该元素类型的所有值都被认为处于该范围内。把缺失的界限指定为包含，会自动转换为排除，例如<code class=\"literal\">[,]</code>会转换为<code class=\"literal\">(,)</code>。你可以把这些缺失的值看作正负无穷大，但它们是特殊的范围类型值，并且被认为超出了任何范围元素类型的正负无穷大值。</p>\n<p lang=\"zh\">具有<span class=\"quote\">“<span class=\"quote\">无穷大</span>”</span>概念的元素类型可以将其用作显式界限值。例如，对于时间戳范围，<code class=\"literal\">[today,infinity)</code>不包括特殊的<code class=\"type\">timestamp</code>值<code class=\"literal\">infinity</code>，而<code class=\"literal\">[today,infinity]</code>则包括它，<code class=\"literal\">[today,)</code>和<code class=\"literal\">[today,]</code>也一样。</p>\n<p lang=\"zh\">函数<code class=\"literal\">lower_inf</code>和<code class=\"literal\">upper_inf</code>分别测试范围是否没有下界和上界。</p>\n</div>\n<div class=\"sect2\" id=\"RANGETYPES-IO\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/rangetypes.html#RANGETYPES-IO\">8.17.5. 范围输入/输出</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">范围值的输入必须遵循下列模式之一：</p>\n<pre class=\"synopsis\">(<em class=\"replaceable\"><code>lower-bound</code></em>,<em class=\"replaceable\"><code>upper-bound</code></em>)\n(<em class=\"replaceable\"><code>lower-bound</code></em>,<em class=\"replaceable\"><code>upper-bound</code></em>]\n[<em class=\"replaceable\"><code>lower-bound</code></em>,<em class=\"replaceable\"><code>upper-bound</code></em>)\n[<em class=\"replaceable\"><code>lower-bound</code></em>,<em class=\"replaceable\"><code>upper-bound</code></em>]\nempty\n</pre>\n<p lang=\"zh\">如前所述，圆括号或方括号指示上下界是排除还是包含。注意最后一种模式是<code class=\"literal\">empty</code>，它表示空范围（即不包含任何点的范围）。</p>\n<p lang=\"zh\"><em class=\"replaceable\"><code>lower-bound</code></em>可以是子类型的合法输入字符串，也可以留空以表示没有下界。同样，<em class=\"replaceable\"><code>upper-bound</code></em>也可以是子类型的合法输入字符串，或者留空以表示没有上界。</p>\n<p lang=\"zh\">每个界限值都可以用<code class=\"literal\">\"</code>（双引号）字符括起来。如果界限值包含圆括号、方括号、逗号、双引号或反斜线，这样做就是必须的，因为否则这些字符会被视为范围语法的一部分。要在带引号的界限值中写入双引号或反斜线，需要在前面加一个反斜线。（另外，在双引号括起来的界限值中，两个连续的双引号表示一个双引号字符，这与 SQL 字符串字面量中单引号的规则类似。）或者，你也可以不使用引号，而是用反斜线转义所有本来会被当作范围语法的字符。另外，如果要把空字符串写成界限值，应写成<code class=\"literal\">\"\"</code>，因为什么都不写表示无限界限。</p>\n<p lang=\"zh\">范围值前后允许有空白，但圆括号或方括号之间的任何空白都会被视为下界或上界值的一部分。（取决于元素类型，这些空白可能有意义，也可能没有意义。）</p>\n<div class=\"note\">\n<h3 class=\"title\" lang=\"zh\">注意</h3>\n<p lang=\"zh\">这些规则与在复合类型字面量中书写字段值的规则非常相似。更多说明见<a class=\"xref\" href=\"/docs/18/rowtypes.html#ROWTYPES-IO-SYNTAX\" title=\"8.16.6. 复合类型的输入和输出语法\">第 8.16.6 节</a>。</p>\n</div>\n<p lang=\"zh\">示例：</p>\n<pre class=\"programlisting\">-- includes 3, does not include 7, and does include all points in between\nSELECT '[3,7)'::int4range;\n\n-- does not include either 3 or 7, but includes all points in between\nSELECT '(3,7)'::int4range;\n\n-- includes only the single point 4\nSELECT '[4,4]'::int4range;\n\n-- includes no points (and will be normalized to 'empty')\nSELECT '[4,4)'::int4range;\n</pre>\n<p lang=\"zh\">多范围的输入形式是用花括号（<code class=\"literal\">{</code>和 <code class=\"literal\">}</code>）括起零个或多个有效范围，各范围之间以逗号分隔。括号和逗号周围允许出现空白。这种写法是为了让人联想到数组语法，不过多范围要简单得多：它只有一个维度，也不需要为其内容加引号。（不过其中各个范围的界限仍可按前述方式加引号。）</p>\n<p lang=\"zh\">示例：</p>\n<pre class=\"programlisting\">SELECT '{}'::int4multirange;\nSELECT '{[3,7)}'::int4multirange;\nSELECT '{[3,7), [8,9)}'::int4multirange;\n</pre>\n</div>\n<div class=\"sect2\" id=\"RANGETYPES-CONSTRUCT\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/rangetypes.html#RANGETYPES-CONSTRUCT\">8.17.6. 构造范围和多范围</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">每种范围类型都有一个与范围类型同名的构造函数。使用构造函数通常比书写范围字面量更方便，因为这样无需为界限值额外加引号。构造函数接受两个或三个参数。两个参数的形式构造标准形式的范围（下界包含，上界排除），而三个参数的形式则按第三个参数指定的界限形式构造范围。第三个参数必须是下列字符串之一：<span class=\"quote\">“<span class=\"quote\"><code class=\"literal\">()</code></span>”</span>、<span class=\"quote\">“<span class=\"quote\"><code class=\"literal\">(]</code></span>”</span>、<span class=\"quote\">“<span class=\"quote\"><code class=\"literal\">[)</code></span>”</span>或者<span class=\"quote\">“<span class=\"quote\"><code class=\"literal\">[]</code></span>”</span>。例如：</p>\n<pre class=\"programlisting\">-- The full form is: lower bound, upper bound, and text argument indicating\n-- inclusivity/exclusivity of bounds.\nSELECT numrange(1.0, 14.0, '(]');\n\n-- If the third argument is omitted, '[)' is assumed.\nSELECT numrange(1.0, 14.0);\n\n-- Although '(]' is specified here, on display the value will be converted to\n-- canonical form, since int8range is a discrete range type (see below).\nSELECT int8range(1, 14, '(]');\n\n-- Using NULL for either bound causes the range to be unbounded on that side.\nSELECT numrange(NULL, 2.2);\n</pre>\n<p lang=\"zh\">每种范围类型也都有一个与多范围类型同名的多范围构造函数。该构造函数接受零个或多个参数，这些参数都必须是相应类型的范围。例如：</p>\n<pre class=\"programlisting\">SELECT nummultirange();\nSELECT nummultirange(numrange(1.0, 14.0));\nSELECT nummultirange(numrange(1.0, 14.0), numrange(20.0, 25.0));\n</pre>\n</div>\n<div class=\"sect2\" id=\"RANGETYPES-DISCRETE\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/rangetypes.html#RANGETYPES-DISCRETE\">8.17.7. 离散范围类型</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">离散范围是指其元素类型具有明确定义的<span class=\"quote\">“<span class=\"quote\">步长</span>”</span>，例如<code class=\"type\">integer</code>或<code class=\"type\">date</code>。在这类类型中，如果两个元素之间不存在合法值，就可以说它们是相邻的。这与连续范围形成对比：在连续范围中，两个给定值之间总是（或几乎总是）可以识别出其他元素值。例如，基于<code class=\"type\">numeric</code>的范围是连续的，基于<code class=\"type\">timestamp</code>的范围也是如此。（尽管<code class=\"type\">timestamp</code>的精度有限，因此理论上可以视为离散的，但通常最好仍将其视为连续的，因为步长通常并不是关注点。）</p>\n<p lang=\"zh\">理解离散范围类型的另一种方式是：对每个元素值，都有一个明确的<span class=\"quote\">“<span class=\"quote\">下一个</span>”</span>或<span class=\"quote\">“<span class=\"quote\">上一个</span>”</span>值。知道这一点后，就可以把原先给定的元素值替换成其下一个或上一个值，从而在范围界限的包含表示和排除表示之间相互转换。例如，在整数范围类型中，<code class=\"literal\">[4,8]</code>和<code class=\"literal\">(3,9)</code>表示相同的值集合；但对基于 numeric 的范围则并非如此。</p>\n<p lang=\"zh\">离散范围类型应当具有一个<em class=\"firstterm\">规范化</em>函数，该函数知道元素类型所期望的步长。规范化函数负责将范围类型中的等价值转换成完全一致的表示形式，特别是对包含或排除界限保持一致。如果未指定规范化函数，那么格式不同的范围即使实际上表示的是同一组值，也总会被视为不相等。</p>\n<p lang=\"zh\">内置范围类型<code class=\"type\">int4range</code>、<code class=\"type\">int8range</code>和<code class=\"type\">daterange</code>都使用一种规范形式：包含下界而排除上界，也就是<code class=\"literal\">[)</code>。不过，用户定义的范围类型也可以采用其他约定。</p>\n</div>\n<div class=\"sect2\" id=\"RANGETYPES-DEFINING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/rangetypes.html#RANGETYPES-DEFINING\">8.17.8. 定义新的范围类型</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">用户可以定义自己的范围类型。最常见的原因，是希望对内置范围类型中未提供的子类型使用范围。例如，要定义一个子类型为<code class=\"type\">float8</code>的新范围类型：</p>\n<pre class=\"programlisting\">CREATE TYPE floatrange AS RANGE (\n    subtype = float8,\n    subtype_diff = float8mi\n);\n\nSELECT '[1.234, 5.678]'::floatrange;\n</pre>\n<p lang=\"zh\">因为<code class=\"type\">float8</code>没有有意义的<span class=\"quote\">“<span class=\"quote\">步长</span>”</span>，所以在这个示例中我们没有定义规范化函数。</p>\n<p lang=\"zh\">当你定义自己的范围时，会自动得到相应的多范围类型。</p>\n<p lang=\"zh\">定义自己的范围类型还允许你指定不同的子类型 B-树操作符类或排序规则，从而改变用于判定哪些值落入给定范围的排序顺序。</p>\n<p lang=\"zh\">如果认为子类型的值是离散而非连续的，则<code class=\"command\">CREATE TYPE</code>命令应指定<code class=\"literal\">canonical</code>函数。规范化函数接受一个输入的范围值，并必须返回一个等价的范围值，该值的界限和格式可能不同。对于表示同一组值的两个范围，例如整数范围<code class=\"literal\">[1, 7]</code>和<code class=\"literal\">[1, 8)</code>，规范化输出必须相同。选择哪一种表示作为规范形式并不重要，只要不同格式的两个等价值总是会被映射为同一种格式的相同值即可。除了调整界限的包含/排除格式之外，如果期望的步长大于子类型能够存储的精度，规范化函数还可能对界限值进行舍入。例如，基于<code class=\"type\">timestamp</code>的范围类型可以定义为步长为一小时，在这种情况下，规范化函数需要把不是一小时整数倍的界限值舍入，或者直接抛出错误。</p>\n<p lang=\"zh\">此外，任何打算与 GiST 或 SP-GiST 索引一起使用的范围类型都应定义子类型差值函数，即<code class=\"literal\">subtype_diff</code>函数。（没有<code class=\"literal\">subtype_diff</code>时索引仍可工作，但效率很可能明显低于提供了差值函数的情况。）子类型差值函数接受两个子类型输入值，并返回它们的差值（即<em class=\"replaceable\"><code>X</code></em>减<em class=\"replaceable\"><code>Y</code></em>），结果表示为一个<code class=\"type\">float8</code>值。在上面的示例中，可以使用函数<code class=\"function\">float8mi</code>，它是常规<code class=\"type\">float8</code>减法操作符的底层实现；但对于其他子类型，则需要某种类型转换。此外，可能还需要仔细考虑如何把差异表示为数字。尽可能地，<code class=\"literal\">subtype_diff</code>函数应与所选操作符类和排序规则所隐含的排序顺序一致；也就是说，只要其第一个参数按该排序顺序大于第二个参数，它的结果就应该为正。</p>\n<p lang=\"zh\">下面给出一个不那么简化的<code class=\"literal\">subtype_diff</code>函数示例：</p>\n<pre class=\"programlisting\">CREATE FUNCTION time_subtype_diff(x time, y time) RETURNS float8 AS\n'SELECT EXTRACT(EPOCH FROM (x - y))' LANGUAGE sql STRICT IMMUTABLE;\n\nCREATE TYPE timerange AS RANGE (\n    subtype = time,\n    subtype_diff = time_subtype_diff\n);\n\nSELECT '[11:10, 23:00]'::timerange;\n</pre>\n<p lang=\"zh\">关于创建范围类型的更多信息，见<a class=\"xref\" href=\"/docs/18/sql-createtype.html\" title=\"CREATE TYPE\"><span class=\"refentrytitle\">CREATE TYPE</span></a>。</p>\n</div>\n<div class=\"sect2\" id=\"RANGETYPES-INDEXING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/rangetypes.html#RANGETYPES-INDEXING\">8.17.9. 索引</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">可以为范围类型的表列创建 GiST 和 SP-GiST 索引。也可以为多范围类型的表列创建 GiST 索引。例如，要创建一个 GiST 索引：</p>\n<pre class=\"programlisting\">CREATE INDEX reservation_idx ON reservation USING GIST (during);\n</pre>\n<p lang=\"zh\">范围上的 GiST 或 SP-GiST 索引可以加速涉及下列范围操作符的查询：<code class=\"literal\">=</code>、<code class=\"literal\">&amp;&amp;</code>、<code class=\"literal\">&lt;@</code>、<code class=\"literal\">@&gt;</code>、<code class=\"literal\">&lt;&lt;</code>、<code class=\"literal\">&gt;&gt;</code>、<code class=\"literal\">-|-</code>、<code class=\"literal\">&amp;&lt;</code>以及 <code class=\"literal\">&amp;&gt;</code>。多范围上的 GiST 索引可以加速涉及同一组多范围操作符的查询。范围上的 GiST 索引以及多范围上的 GiST 索引，还分别可以加速涉及下列跨类型操作符的查询，也就是范围到多范围和多范围到范围的操作符：<code class=\"literal\">&amp;&amp;</code>、<code class=\"literal\">&lt;@</code>、<code class=\"literal\">@&gt;</code>、<code class=\"literal\">&lt;&lt;</code>、<code class=\"literal\">&gt;&gt;</code>、<code class=\"literal\">-|-</code>、<code class=\"literal\">&amp;&lt;</code>以及 <code class=\"literal\">&amp;&gt;</code>。更多信息见<a class=\"xref\" href=\"/docs/18/functions-range.html#RANGE-OPERATORS-TABLE\" title=\"表 9.58. 范围操作符\">表 9.58</a>。</p>\n<p lang=\"zh\">此外，也可以为范围类型的表列创建 B-树和 hash 索引。对于这些索引类型，基本上唯一有用的范围操作就是等值。系统为范围值定义了对应<code class=\"literal\">&lt;</code>和<code class=\"literal\">&gt;</code>操作符的 B-树排序顺序，但这种顺序相当任意，在现实中通常并没有什么用处。范围类型的 B-树和 hash 支持主要是为了允许在查询内部进行排序和 hash 运算，而不是用于创建实际的索引。</p>\n</div>\n<div class=\"sect2\" id=\"RANGETYPES-CONSTRAINT\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h3 class=\"title\" lang=\"zh\"><span class=\"sect2\"><a href=\"/docs/18/rangetypes.html#RANGETYPES-CONSTRAINT\">8.17.10. 范围上的约束</a></span></h3>\n</div>\n</div>\n</div>\n<p lang=\"zh\">虽然<code class=\"literal\">UNIQUE</code>是标量值的一种自然约束，但它通常并不适用于范围类型。相反，排他约束往往更合适（见<a class=\"link\" href=\"/docs/18/sql-createtable.html#SQL-CREATETABLE-EXCLUDE\">CREATE TABLE ... CONSTRAINT ... EXCLUDE</a>）。排他约束允许在范围类型上指定诸如<span class=\"quote\">“<span class=\"quote\">不重叠</span>”</span>之类的约束。例如：</p>\n<pre class=\"programlisting\">CREATE TABLE reservation (\n    during tsrange,\n    EXCLUDE USING GIST (during WITH &amp;&amp;)\n);\n</pre>\n<p lang=\"zh\">该约束会阻止表中同时存在任何重叠值：</p>\n<pre class=\"programlisting\">INSERT INTO reservation VALUES\n    ('[2010-01-01 11:30, 2010-01-01 15:00)');\nINSERT 0 1\n\nINSERT INTO reservation VALUES\n    ('[2010-01-01 14:45, 2010-01-01 15:45)');\nERROR:  conflicting key value violates exclusion constraint \"reservation_during_excl\"\nDETAIL:  Key (during)=([\"2010-01-01 14:45:00\",\"2010-01-01 15:45:00\")) conflicts\nwith existing key (during)=([\"2010-01-01 11:30:00\",\"2010-01-01 15:00:00\")).\n</pre>\n<p lang=\"zh\">你可以使用<a class=\"link\" href=\"/docs/18/btree-gist.html\" title=\"F.8. btree_gist — 具有 B-树行为的 GiST 操作符类\"><code class=\"literal\">btree_gist</code></a>扩展在普通标量数据类型上定义排他约束，然后再将其与范围上的排他约束结合起来，以获得最大的灵活性。例如，在安装了<code class=\"literal\">btree_gist</code>之后，下面的约束仅在会议室编号相等时才会拒绝重叠的范围：</p>\n<pre class=\"programlisting\">CREATE EXTENSION btree_gist;\nCREATE TABLE room_reservation (\n    room text,\n    during tsrange,\n    EXCLUDE USING GIST (room WITH =, during WITH &amp;&amp;)\n);\n\nINSERT INTO room_reservation VALUES\n    ('123A', '[2010-01-01 14:00, 2010-01-01 15:00)');\nINSERT 0 1\n\nINSERT INTO room_reservation VALUES\n    ('123A', '[2010-01-01 14:30, 2010-01-01 15:30)');\nERROR:  conflicting key value violates exclusion constraint \"room_reservation_room_during_excl\"\nDETAIL:  Key (room, during)=(123A, [\"2010-01-01 14:30:00\",\"2010-01-01 15:30:00\")) conflicts\nwith existing key (room, during)=(123A, [\"2010-01-01 14:00:00\",\"2010-01-01 15:00:00\")).\n\nINSERT INTO room_reservation VALUES\n    ('123B', '[2010-01-01 14:30, 2010-01-01 15:30)');\nINSERT 0 1\n</pre>\n</div>\n</div>", "manual_path": "rangetypes.html", "localization": {"status": "complete", "sources": [{"url": "/docs/18/functions-matching.html", "method": "same-major semantic node", "sha256": "704120d783880b39b956c073d1a82ba1f40b35068b4d3b9a195f543b86c3a22a", "language": "zh", "matched_nodes": ["#FUNCTIONS-MATCHING/div[9]/div[51]/p[2]/em[2]"]}, {"url": "/docs/18/rangetypes.html", "method": "same-major semantic node", "sha256": "eabc0a4ca11d8eee250b0f9589f3a4566764e401974254e5665aca0e86f35287", "language": "zh", "matched_nodes": ["#RANGETYPES/div[0]", "#RANGETYPES/div[10]/p[1]", "#RANGETYPES/div[10]/p[2]", "#RANGETYPES/div[10]/p[3]", "#RANGETYPES/div[11]/div[7]/h3[0]", "#RANGETYPES/div[11]/div[7]/p[1]", "#RANGETYPES/div[11]/p[10]", "#RANGETYPES/div[11]/p[1]", "#RANGETYPES/div[11]/p[3]", "#RANGETYPES/div[11]/p[4]", "#RANGETYPES/div[11]/p[5]", "#RANGETYPES/div[11]/p[6]", "#RANGETYPES/div[11]/p[8]", "#RANGETYPES/div[12]/p[1]", "#RANGETYPES/div[12]/p[3]", "#RANGETYPES/div[13]/p[1]", "#RANGETYPES/div[13]/p[2]", "#RANGETYPES/div[13]/p[3]", "#RANGETYPES/div[13]/p[4]", "#RANGETYPES/div[14]/p[10]", "#RANGETYPES/div[14]/p[1]", "#RANGETYPES/div[14]/p[3]", "#RANGETYPES/div[14]/p[4]", "#RANGETYPES/div[14]/p[5]", "#RANGETYPES/div[14]/p[6]", "#RANGETYPES/div[14]/p[7]", "#RANGETYPES/div[14]/p[8]", "#RANGETYPES/div[15]/p[2]", "#RANGETYPES/div[15]/p[4]", "#RANGETYPES/div[15]/p[5]", "#RANGETYPES/div[16]/p[2]", "#RANGETYPES/div[16]/p[4]", "#RANGETYPES/div[16]/p[6]", "#RANGETYPES/div[1]/dl[0]/dt[0]", "#RANGETYPES/div[1]/dl[0]/dt[1]", "#RANGETYPES/div[1]/dl[0]/dt[2]", "#RANGETYPES/div[1]/dl[0]/dt[3]", "#RANGETYPES/div[1]/dl[0]/dt[4]", "#RANGETYPES/div[1]/dl[0]/dt[5]", "#RANGETYPES/div[1]/dl[0]/dt[6]", "#RANGETYPES/div[1]/dl[0]/dt[7]", "#RANGETYPES/div[1]/dl[0]/dt[8]", "#RANGETYPES/div[1]/dl[0]/dt[9]", "#RANGETYPES/div[7]/div[2]/ul[0]/li[0]", "#RANGETYPES/div[7]/div[2]/ul[0]/li[1]", "#RANGETYPES/div[7]/div[2]/ul[0]/li[2]", "#RANGETYPES/div[7]/div[2]/ul[0]/li[3]", "#RANGETYPES/div[7]/div[2]/ul[0]/li[4]", "#RANGETYPES/div[7]/div[2]/ul[0]/li[5]", "#RANGETYPES/div[7]/p[1]", "#RANGETYPES/div[7]/p[3]", "#RANGETYPES/div[8]/p[2]", "#RANGETYPES/div[9]/p[1]", "#RANGETYPES/div[9]/p[2]", "#RANGETYPES/div[9]/p[3]", "#RANGETYPES/p[4]", "#RANGETYPES/p[5]", "#RANGETYPES/p[6]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "range of bigints", "/versions/18/facts/0/label": "Catalog name", "/versions/18/facts/1/label": "Type OID", "/versions/18/facts/2/label": "Type kind", "/versions/18/facts/2/value": "Range", "/versions/18/facts/3/label": "Declared length", "/versions/18/facts/3/value": "Variable length (varlena)", "/versions/18/facts/4/label": "Storage strategy", "/versions/18/facts/4/value": "extended", "/versions/18/facts/5/label": "Input function", "/versions/18/facts/6/label": "Output function", "/versions/18/related/0/label": "pg_type catalog", "/versions/18/related/1/label": "pg_cast catalog", "/versions/18/related/2/label": "pg_operator catalog", "/versions/18/related/3/label": "pg_opclass catalog", "/versions/18/related/4/label": "Arrays"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "8aa800a7aaa06d25d7025eb92c55c3fdde7f353a0beef1a4465f601b963db869"}, "comparison_data": {"casts": [{"castfunc": "int8multirange(int8range)", "castmethod": "f", "castsource": "int8range", "casttarget": "int8multirange", "castcontext": "e"}], "facts": [{"label": "Catalog name", "value": "pg_catalog.int8range"}, {"label": "Declared length", "value": "Variable length (varlena)"}, {"label": "Input function", "value": "range_in"}, {"label": "Output function", "value": "range_out"}, {"label": "Storage strategy", "value": "extended"}, {"label": "Type OID", "value": "3926"}, {"label": "Type kind", "value": "Range"}], "ranges": [{"rngtypid": "int8range", "rngsubopc": "btree/int8_ops", "rngsubdiff": "int8range_subdiff", "rngsubtype": "int8", "rngcanonical": "int8range_canonical", "rngcollation": "0", "rngmultitypid": "int8multirange"}], "aliases": [], "catalog": {"typacl": "_null_", "typlen": "-1", "typelem": "0", "typname": "int8range", "typsend": "range_send", "typtype": "r", "typalign": "d", "typarray": "_int8range", "typbyval": "f", "typdelim": ",", "typinput": "range_in", "typmodin": "-", "typndims": "0", "typrelid": "0", "typmodout": "-", "typoutput": "range_out", "typtypmod": "-1", "typanalyze": "range_typanalyze", "typdefault": "_null_", "typnotnull": "f", "typreceive": "range_recv", "typstorage": "x", "typbasetype": "0", "typcategory": "R", "typcollation": "0", "typisdefined": "t", "typsubscript": "-", "typdefaultbin": "_null_", "typispreferred": "f", "array_type_name": "_int8range"}, "operators": [], "operator_classes": []}, "comparison_hash": "1df9830a9da85fd1f19c488f7071a32a4c41fb6293450c3fc434edbc3cc8eea6", "manual_language": "zh", "operator_classes": [], "manual_documentation": "dedicated family chapter"}, "from": "17", "comparison": {"available": true, "changes": [], "prose_changed": true}}