关于Postgresql数据库查询结果不足位数前面补位的操作
Posted JAVA分享圈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Postgresql数据库查询结果不足位数前面补位的操作相关的知识,希望对你有一定的参考价值。
问题描述:数据库在建表时将日期和时间分为两个字段,而且存储类型为numeric,所以数据库存储的时间为l_date:20180512,l_input_time:120804。如下图:
但系统需求一般都会要求按时间查询,比如查询2018-05-21 08:05:10到2018-05-25 08:05:10之间的数据,这就给我们查询带来了麻烦,尽管这不是个复杂的问题。
首先想到的就是把两个字段合并变成一个字段来做条件查询,这时我们会发现一个问题,如上面图中所示,当时间小于12点时时间只存了五位数字,这时候之间拼接会变成20180522 82538,这样明显不对。
这时我们自然会想到先让时间补位再拼接,代码如下:
下面我面简单介绍一下Postgresql中有一些函数;
函数 | 说明 | 实例 | 结果 | ||
---|---|---|---|---|---|
length(String) | 计算字符串长度 | length('1234') | 4 | ||
length(String bytea, encoding name ) | 计算字符串长度,指定字符串使用的编码 | length('1234', 'UTF8') | 4 | ||
CAST(name AS type) | 将指定字段转换成指定类型 | CAST(1234 as VARCHAR) | '1234' | ||
lpad(String text,length int [,fill text]) | 通过填充字符填充(默认情况下的空间)将字符串填充到长度长度。如果不足某一长度,则在左边自动补上指定的字符串,直至达到指定长度,可同时指定多个自动填充的字符。如果字符串已经长于长度,那么它被截断(在右边)。 | lpad('82538', 6, '0') | 082538 | ||
String || String or String || non-String or non-String || String | 连接操作 | 'Post' || 'greSQL' | PostgreSQL | ||
bit_length(String) | 计算字符串的位数 | bit_length('1234') | 32 | ||
char_length(String) or character_length(String) | 计算字符串中字符个数 | char_length('1234') | 4 | ||
lower(String) | 转换字符串为小写 | lower('AsAA') | asaa | ||
octet_length(String) | 计算字符串的字节数 | octet_length('AsAA') | 4 | ||
overlay(string placing string from int [for int]) | 替换字符串中任意长度的子字串为新字符串 | overlay('asfdasf' placing 'hom' from 2 for 4) | ahomsf | ||
position(substring in string) | 子串在一字符串中的位置 | position('z' in 'zhuzi') | 1 | ||
substring(string [from int] [for int]) | 截取任意长度的子字符串 | substring('zhuzi' from 2 for 3) | huz | ||
substring(string from pattern) | 利用正则表达式对一字符串进行任意长度的字串的截取 | substring('zhuzi' from '...$') | uzi | ||
substring(string from pattern for escape) | 利于正则表达式对某类字符进行删除,以得到子字符串 | substring('zhuzi' from '%#"h_z#"_' for '#') | huz | ||
trim([leading | trailing | both] [characters] from string) | 去除尽可能长开始,结束或者两边的某类字符,默认为去除空白字符,当然可以自己指定,可同时指定多个要删除的字符串 | trim(leading 'z' from 'zhuzi') | huzi | ||
upper(string) | 将字符串转换为大写 | upper('zhuzi') | ZHUZI | ||
ascii(string) | 得到某一个字符的Assii值 | ascii('z') | 122 | ||
btrim(string text [, characters text]) | 去除字符串两边的所有指定的字符,可同时指定多个字符 | btrim('xyxtrimyyx', 'xy') | trim | ||
chr(int) | 得到某ACSII值对应的字符 | chr(65) | A | ||
convert(string bytea, src_encoding name, dest_encoding name) | 转换字符串编码,指定源编码与目标编码 |
convert('text_in_utf8', 'UTF8', 'LATIN1') | text_in_utf8 represented in ISO 8859-1 encoding | ||
convert_from(string bytea, src_encoding name) | 转换字符串编码,自己要指定源编码,目标编码默认为数据库指定编码 | convert_from('text_in_utf8', 'UTF8') | text_in_utf8 represented in the current database encoding | ||
convert_to(string text, dest_encoding name) | 转换字符串编码,源编码默认为数据库指定编码,自己要指定目标编码 | convert_to('some text', 'UTF8') | some text represented in the UTF8 encoding | ||
decode(string text, type text) | 对字符串按指定的类型进行解码 | decode('MTIzAAE=', 'base64') | MTIzAAE= | ||
encode(data bytea, type text) | 与decode相反,对字符串按指定类型进行编码 | encode(E'123\\000\\001', 'base64') | MTIzAAE= | ||
initcap(string) | 将字符串所有的单词进行格式化,首字母大写,其它为小写 | initcap('hi zhuzi') | Hi Zhuzi | ||
ltrim(string text [, characters text]) | 删除字符串左边某一些的字符,可以时指定多个要删除的字符 | ltrim('zhuzi','zh') | uzi | ||
md5(string) | 将字符串进行md5编码 | md5('abc') | d7f766a01ea37116b51595d20d76f3df | ||
pg_client_encoding() | 得到pg客户端编码 | pg_client_encoding() | UTF8 | ||
quote_ident(string text) | 对某一字符串加上两引号 | quote_ident('Foo bar') | "Foo bar" | ||
quote_literal(text) | 对字符串里两边加上单引号 | quote_literal(11) | '11' | ||
regexp_matches(string text, pattern text [, flags text]) | 对字符串按正则表达式进行匹配,如果存在则会在结果数组中表示出来 | regexp_matches('foobarbequebaz', '(bar)(beque)') | {bar,beque} | ||
regexp_replace(string text, pattern text, replacement text [, flags text]) | 利用正则表达式对字符串进行替换 | regexp_replace('Thomas', '.[mN]a.', 'M') | ThM | ||
regexp_split_to_array(string text, pattern text [, flags text ]) | 利用正则表达式将字符串分割成数组 | regexp_split_to_array('hello world', E'\\s+') | {hello,world} | ||
regexp_split_to_table(string text, pattern text [, flags text]) | 利用正则表达式将字符串分割成表格 | regexp_split_to_table('hello world', E'\\s+') |
|
||
repeat(string text, number int) | 重复字符串一指定次数 | repeat('Pg', 4) | PgPgPgPg | ||
replace(string text, from text, to text) | 将字符的某一子串替换成另一子串 | replace('abcdefabcdef', 'cd', 'XX') | abXXefabXXef | ||
rpad(string text, length int [, fill text]) | 去除字符串右边指定的字符 | rtrim('trimxxxx', 'x') | trim | ||
split_part(string text, delimiter text, field int) | 对字符串按指定子串进行分割,并返回指定的数值位置的值 | split_part('abc~@~def~@~ghi', '~@~', 2) | def | ||
strpos(string, substring) | 指定字符串在目标字符串的位置 | strpos('high', 'ig') | 2 | ||
substr(string, from [, count]) | 截取子串 | substr('alphabet', 3, 2) | ph | ||
to_hex(number int or bigint) | 对数值进行十六进制编码 | to_hex(1234) | 4d2 | ||
translate(string text, from text, to text) | 将字符串中某些匹配的字符替换成指定字符串,目标字符与源字符都可以同时指定多个 | translate('12345', '14', 'ax') | a23x5 |
以上是关于关于Postgresql数据库查询结果不足位数前面补位的操作的主要内容,如果未能解决你的问题,请参考以下文章
按百分位数将类似 sql 的查询的结果分组:在 Redshift / postgresql