绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
KDB数据库的专属语言——Q语言
2022-05-25 16:49:30

前言

KDB有着自己独特的语言,那就是Q语言。首先先介绍Q语言的基本数据类型,Q语言的基本数据类型就是:Atoms(我在这就理解为原子吧,如果有更好的理解欢迎指正)。

下面将从Integer Data(整形数据)、Floating Point Data(浮点型数据)、Binary Data(二进制数据)、Text Data(文本数据)、Temporal Data(时间数据)、Arithmetic Infinities and Nulls(数学数据)等几个方面来介绍。

首先可以了解一下Q语言的数据类型与SQL、Java、.NET的数据类型有哪些区别。


Q语言没有了其他语言中常见的string类型,改为了symbol类型(感觉很奇特,在后面的学习当中用到的太多了)。下面是Q语言的常见数据类型,可以看书Q语言将table(表)、enumeration(枚举)、dictionary(字典)、function(函数)、nil item()也算作一种数据类型。

Q语言数据类型表

一、整型

整型包含了三种数据类型,分别为long、short和int,都是整数类型,只是所占的空间大小不同。可以利用type命令查看数据类型,返回的结果就是该数据类型的Numtype。

q)type 42 /查询42的数据类型是什么
-7h /返回的结果为-7h,这里-号代表为Atom(原子)类型,7(可以对照Q语言数据类型表查看)代表为long类型。
q)type 42i /查询int类型的42i的返回结果
-6h  /返回的结果为-6h,这里-号代表为Atom(原子)类型,6(可以对照Q语言数据类型表查看)代表为int类型
q)type 42h /查询short类型的42h的返回结果
-5h /返回的结果为-5h,这里-号代表为Atom(原子)类型,5(可以对照Q语言数据类型表查看)代表为short类型

二、浮点数类型

1、浮点数(CharType为f),与其他编程语言类似,浮点数指浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。可以看下在cmd中输入一些浮点数后的返回结果,f代表为float类型,用type查询返回结果为-9h,-号代表为Atom(原子)类型,9(可以对照Q语言数据类型表查看)代表为float类型。有一个特殊显示情况,对于1.0,则返回结果为1f,省去了0,并加了一个f后缀。Q语言中,指数也属于浮点数类型。

q)3.1415926
3.1415926
q)1f
1f
q)1.0
1f
q)1.1f
1.1
q)type 3.14
-9h
q)type 1.234e7
-9h

2、浮点数的显示

由于显示的精度原因,我们可能无法显示太长的浮点数,如1.23456789012,在我的电脑上只显示1.234568,要想显示全部,可以利用\P来控制显示精度。

q)1.23456789012
1.234568
q)\P 12   / “\P”表示控制浮点数显示的输出精度,12表示总共显示12位数字(不包括小数点)
q)1.23456789012
1.23456789012
q)\P 5
q)1.23456789123
1.2346
q)\P 6
q)1.23456789123
1.23457

三、二进制数据类型

二进制数据类型包括boolean(布尔类型)、byte(字节类型)、GUID(全局标识符类型)。布尔类型在输入的时候需要添加b的后缀(0b或者1b),同时布尔类型和其他数据类型可以进行运算,预算结果后的类型为与其进行运算的数据类型,不再是布尔类型。如:3.1415-1b,返回结果为2.1415;3.1415+1b,返回结果为4.1415。

q)type b
-1h  /返回的结果为-1h,这里-号代表为Atom(原子)类型,1(可以对照Q语言数据类型表查看)代表为boolean类型
q)type 1b
-1h  
q)3.1415+1b
4.1415
q)3.1415-1b
2.1415

字节类型使用一个字节来存储无符号的8位值,并由前导类型指示符0x后跟十六进制数值。如:16进制0x2a表示的十进制数为42,我们可以尝试使用$将16进制转换为二进制。同时如果十进制数与十六进制数相加,后的结果为十进制。

q)0x2a
0x2a
q)"i" $ 0x2a /i表示要转换的十进制数据类型为int类型,$为重载符,可以将后面的数据转换为操作符前面制定的转换类型(后续会专门写一篇类型转换的专题)
42i
q)1+0x29 /十进制数1与十六进制数0x29(十进制为41)相加,返回结果为十进制数42
42

四、文本数据类型

文本数据类型包含char(字符串类型)和symbol(符号类型),这两种类型类似于SQL中的CHAR与VARCHAR两种类型。char类型用双引号引起来表示,如“kdb”,表示一种char类型。也可以利用type来查询对应的数据类型。

q)"kdb" /输入一个char类型,注意要用引号引起来
"kdb"
q)type "kdb" /查询“kdb”的数据类型
10h /返回结果为10h,10(可以对照Q语言数据类型表查看)代表为char类型,与前面查询不同之处返回的结果没有了-号,这是因为不是Atom(原子)类型了,所以没有了-号,下面一个查询“k”的数据类型,因为k为一个字母,则为原子类型,因此返回的结果就包含了-号
q)type "k"
-10h
symbol类型用`符号来表示,并放在开头的位置。如“kdb”,表示一种char类型。也可以利用type来查询对应的数据类型。
q)`q /输入一个symbol类型
`q
q)`kdb`q /输入两个symbol类型
`kdb`q
q)type `q /查询`q的数据类型
-11h
q)type `kdb /查询`kdb的数据类型
-11h /可以看出分别查询`q和`kdb两个数据的数据类型返回结果都为-11h,都有-号返回,说明`kdb·也为Atom(原子类型),11(可以对照Q语言数据类型表查看)代表为symbol类型 
q)type `kdb`q
11h  /可以看出同时查询`q和`kdb两个数据的数据类型返回结果为11h,没有了-号,说明单个`符号后面的看做一个整体,与char类型有些不用。

五、时间数据类型

Q语言中针对日期时间操作非常简单方便且强大(这也就凸显除了KDB作为时间序列数据库上的本意),时间数据类型包含date(日期类型)、Time(时间类型)、Date-Time(日期-时间类型)、month(月类型)、minute(分钟类型)、second(秒类型)。

日期都是以2000.01.01为时间的起始点,如将2001.01.01转换为int类型,则结果是366天。

q)"i" $ 2000.01.01 
0i
q)"i" $ 2001.01.01 /将日期类型转换为int类型,返回结果为366i,则表示2000.01.01~2001.01.01之间有366天。
366i
q)"i" $ 1999.12.31 /将日期类型转换为int类型,返回结果为-1i,则表示2000.01.01~1999.12.31之间有-1天。
-1i
q)"i" $ 2000.02.01 /将日期类型转换为int类型,返回结果为31i,则表示2000.01.01~2000.02.01之间有31天。
31i

time 类型就是一天中的时分秒毫秒。time类型在kdb+表示为32位的int,表示相对于今天0点0分0毫秒的相对值。小单位为毫秒。因此,int 和time类型也能够轻松转换,时间操作上也轻松方便。当然Date-Time类型就是 date+time合并在一起。Q语言中还提供了分钟秒等类型。

q)`int$00:00:00.000  /将time类型转换为int类型,返回结果为0毫秒
0i
q)`int$00:00:01.000   /将time类型转换为int类型,返回结果为1000毫秒(1秒=1000毫秒)
1000i
q)`long$12:34:56.123456789  /将time类型转换为long类型,返回结果为毫秒
45296123456789
q)2000.01.01T12:00:00.000   /Date-Time类型
2000.01.01T12:00:00.000
q)`date$2000.01.02T12:00:00.000 /将Date-Time类型转换为Date类型,返回结果2000.01.02
2000.01.02
q)`time$2000.01.02T12:00:00.000 /将Date-Time类型转换为Date类型,返回结果时间
12:00:00.000
q)`date$2014.11.22D17:43:40.123456789 /将含有毫秒的Date-Time类型转换为 date类型
2014.11.22
q)`time$2014.11.22D17:43:40.123456789  /将含有毫秒的Date-Time类型转换为time类型
17:43:40.123
q)2015.11m /月类型
2015.11m
q)2001.01m=12 /2001.01m相对于2000.01为12个月,因此结果应该是与12相等
1b
这里需要注意2014.11与2014.11m的区别,一个是浮点数,一个是month类型
q)type 2014.11
-9h
q)type 2014.11m
-13h

六、Infinities(无穷)与(Nulls)空数据类型

其他数据类型的空值表示方式如下:


来源 https://zhuanlan.zhihu.com/p/60259225


分享好友

分享这个小栈给你的朋友们,一起进步吧。

Kdb+
创建时间:2022-03-28 16:14:06
Kdb+
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • itt0918
    专家
戳我,来吐槽~