![1a845ce772961e9b89d75f3a761d3456.png](https://i-blog.csdnimg.cn/blog_migrate/b9c9990ffde43f4319186161c506eec6.jpeg)
前言
KDB有着自己独特的语言,那就是Q语言。首先先介绍Q语言的基本数据类型,Q语言的基本数据类型就是:Atoms(我在这就理解为原子吧,如果有更好的理解欢迎指正)。
下面将从Integer Data(整形数据)、Floating Point Data(浮点型数据)、Binary Data(二进制数据)、Text Data(文本数据)、Temporal Data(时间数据)、Arithmetic Infinities and Nulls(数学数据)等几个方面来介绍。
首先可以了解一下Q语言的数据类型与SQL、Java、.NET的数据类型有哪些区别。
![cddc5d850e52aaffcaba8fc2d19052d5.png](https://i-blog.csdnimg.cn/blog_migrate/6e37a4a16c90a464d254e361cedd0559.png)
Q语言没有了其他语言中常见的string类型,改为了symbol类型(感觉很奇特,在后面的学习当中用到的太多了)。下面是Q语言的常见数据类型,可以看书Q语言将table(表)、enumeration(枚举)、dictionary(字典)、function(函数)、nil item(无效)也算作一种数据类型。
![f1d735c71f154cc1c40fc3a78143fa45.png](https://i-blog.csdnimg.cn/blog_migrate/bbe49957aff28fe0f95b153652eb2aae.jpeg)
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 0b
-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)空数据类型
![d763dd3b71152f18e27c42b950e4f8ef.png](https://i-blog.csdnimg.cn/blog_migrate/e4d6869ce007c072985d7b305c050487.jpeg)
其他数据类型的空值表示方式如下:
![428aca3fe4a74f9c96c6f168deecb162.png](https://i-blog.csdnimg.cn/blog_migrate/4982421110c6018f504820d8185f669c.png)