date类型只取年月日_Q语言——数据类型转换

dc5446e27d4c798e7dba116821bc2f0a.png

前言

有时候我们需要将一种数据类型转换为另外一种数据类型,但是有时候可以正确的数据类型转换,有时候可能虽然能够转换,但是会丢失一些信息,前面我们介绍过不同的数据类型的所占的空间不同。

f734a0cc05a923d9bb7ce71862250ef6.png
数据类型表

一. 基本数据类型

1. 基本数据类型

这里我们给出常用的数据类型,可以仔细看一下下表的type、type symbol、type char和type num。

95e8d1b2ac1df7ef1b39145d0e70aa14.png
数据类型简表

2. 数据类型查看

我们可以通过type函数来查看一个数据是什么类型,通常返回的是数据类型的type num值。如果数据类型是原子的,则返回的值前会加一个“-”号。

q)type 2
-7h
q)type 1 2 3
7h
q)type 98.6
-9h
q)type 1.1 2.0 3
9h
q)type `a
-11h
q)type `a`b`c
11h
q)type "a"
-10h
q)type "abc"
10h
q)type "abc""c"
-10h
q)type (4h; 4i; 4j) /普通列表的数据num为0h
0h
q)type (1 2 3; 4 5 6)
0h
q)type (`a`b`c!1 2 3) /字典的数据num为99h
99h
q)type ([k:`a`b`c] v:1 2 3) /keyed table也是99h
99h
q)type ([] c1:`a`b`c; c2:1 2 3) /一般table为98h
98h

3. 变量的数据类型

变量的数据类型由所给赋的值的类型所决定

q)a:42 /给变量a赋值42
q)type a /a的数据类型num值为-7h
-7h
q)a:"abc" /给变量a赋值string变量“abc”
q)type a /a的数据类型num值为10h
10h
q)a:`s /给变量a赋值string变量`s
q)type a /a的数据类型num值为-11h
-11h
q)get `. /通过get函数获取变量的值,我们发现变量返回类似于一个字典
a| s
q)b:"abc"
q)type b
10h
q)c:`s
q)type c
-11h
q)get `. /通过get函数+`.符号可以获取内存中所有变量名称与对应的值
a| `s
b| "abc"
c| `s
q)value `. /通过value函数+`.符号可以获取内存中所有变量名称与对应的值
a| `s
b| "abc"
c| `s
q)a:42
q)get `.
a| 42
b| "abc"
c| `s
q)f:{[p1] 6*p1} 
q)get `. /我们可以看到函数f与变量一样存储在内存中
a| 42
b| "abc"
c| `s
f| {[p1] 6*p1}

二. 数据类型转换

1. 类型转换

类型转换是将一种类型转换为另一种兼容类型。由于q是动态类型的,因此使用二元运算符“$”操作符在运行时进行转换。操作符的右边是要转换的数据类型,左右是要转换的数据,我们可以通过三种形式作为右边的数据转换目标,分别是:type num、type char和type symbol。

q)7h$4i /通过type num值进行数据类型转换
4
q)"j"$4i /通过type char值进行数据类型转换
4
q)`long$4i /通过type symbol值进行数据类型转换
4

2. 转换为宽数据类型

不同的数据类型在内存中所占的大小是不同的,由窄size数据类型转换为宽size数据类型一般不会造成信息丢失。

q)7h$4i /int 转换为long,
4
q)9h$4 /long转换为float
4f
q)“j”$4i /int 转换为long
4
q)“f”$4 /long转换为float
4f
q)`long$4i /int 转换为long
4
q)`float$4 /long转换为float
4f

3. 转换为窄数据类型

不同的数据类型在内存中所占的大小是不同的,由宽size数据类型转换为窄size数据类型会造成信息丢失。

q)`long$12.345 /由float转换为long造成信息丢失
12
q)`short$123456789 /由long转换为short造成信息丢失
32767h

4. 跨数据类型转换

q)`char$42 /ASCII码42代表的符号是*号
"*"
q)`long$"n" /符号n代表的ASCII是10
10

5. 时间数据类型独特的处理方式

我们知道KDB作为时序数据库,时间数据类型因此是一种非常重要的数据类型,因此时间数据类型也有着独特的处理方式。

q)`date$0 /由于q语言的时间是从2000年1月1日作为时间原点,因此0转换为date类型就是2000.01.01
2000.01.01
q)`int$2001.01.01 /2000.01.01到2001.01.01之间有366天,因此将时间类型转换为int类型,结果为这一年的天数
366i
q)`long$12:00:00.0000000000 /将时间类型的时间转换为long类型,则有43200000000000毫秒
43200000000000
q)`timespan$0 /将0转换为时间类型,则代表凌晨0点0分0秒
0D00:00:00.000000000
q)`date$2015.01.02D10:20:30.123456789 /从时间类型中提取年月日
2015.01.02
q)`year$2015.01.02 /从时间类型中提取年
2015i
q)`month$2015.01.02 /从时间类型中提取年月
2015.01m
q)`mm$2015.01.02 /从时间类型中提取月
1i
q)`mm$2015.02.02
2i
q)`dd$2015.01.02 /从时间类型中提取日
2i
q)`hh$10:20:30.123456789 /从时间类型中提取小时
10i
q)`minute$10:20:30.123456789 /从时间类型中提取时分
10:20
q)`uu$10:20:30.123456789 /从时间类型中提取分
20i
q)`second$10:20:30.123456789 /从时间类型中提取时分秒
10:20:30
q)`ss$10:20:30.123456789 /从时间类型中提取秒
30i

6. 原子类型转换

对于Q语言中的原子数据,我们可以对原子类型进行多个数据同时转换。

q)"i"$10 20 30
10 20 30i
q)`float$(42j; 42i; 42j)
42 42 42f
q)`short`int`long$42
42h
42i
42
q)"ijf"$98.6
99i
99
98.6
q)"ijf"$10 20 30
10i
20
30f

三. 文本数据类型转换

1. 转换为字符串数据类型

Q语言的字符串数据其实是一个简单的char类型的列表。一般编程语言都有将字符串转换为其他类型的操作。可以使用string关键字将其他类型数据转换为char类型。

q)string 42
"42" /这里的42不再是42这个值,而是以这个列表包含4和2两个元素
q)string 4 /由于4做一个单原子,这里转换为string类型后会将4转换为enlist类型的4
,"4"
q)string 42i
"42"
q)a:2.0
q)string a
,"2"
q)f:{x*x}
q)string f
"{x*x}"
q)string 1 2 3
,"1"
,"2"
,"3"
q)string "string" /Q语言中字符串是一个char类型的列表,因此这里会将字符串看做是一个列表
,"s"
,"t"
,"r"
,"i"
,"n"
,"g"
q)string (1 2 3; 10 20 30)
,"1" ,"2" ,"3"
"10" "20" "30"
q)string `Life`the`Universe`and`Everything /将symbol类型转换为字符串类型
"Life"
"the"
"Universe"
"and"
"Everything"

2. string——>symbol

q)`$"abc" /作为字符串类型,这里”abc”相当于是一个列表中的三个元素
`abc /作为symbol类型,这里的abc是一个元素
q)a:"abc"
q)a[0]
"a"
q)a[1]
"b"
q)b:`abc`def
q)b[0]
`abc
q)`$"Hello World"
`Hello World
q)`$"Zaphod "Z""
`Zaphod "Z"
q)`$("Life";"the";"Universe";"and";"Everything")
`Life`the`Universe`and`Everything

四. 枚举

1. 什么是枚举

其他编程语言中,枚举类型是一种将一系列名称与相应的整数值组相关联的方法。枚举类型有多种用途。

  • 1)使用描述性名称而不是任意数字。例如,“红色”,“绿色”,“蓝色”而不是0,1和2。
  • 2)进行类型检查以确保仅提供允许的值。例如,从列表中选择颜色名称而不是记住其编号不易出错。
  • 3)它提供了命名空间,意思是同一名称可以在不同的域中重复使用而不用担心混淆。例如,color.blue和note.blue。

2. 数据标准化

从广义上讲,数据规范化旨在消除重复,仅保留最低要求的数据。例如,证券交易所股票代码。逐字存储这些字符串的长列表存在两个问题。

  • 可变长度的值使存储管理复杂化并使检索效率低下;
  • 重复值可能导致重复数据。当值发生变化时,很难保持同步。

我们可以通过下面的例子来看数据标准化的好处。

q)u:`huawei`apple`samsung`oppo /一个包含四家公司名称的symbol列表
q)v:1000000?u /从u中随机选取1000000个数据出来,每次从四家公司中随机选取一个组成一个新的列表v
q)v
`samsung`huawei`samsung`huawei`apple`oppo`samsung`huawei`huawei`huawei`samsung`samsung`apple`huaw..
q)k:u?v /将v列表中的每一个元素对应的u中的索引号赋值给k
q)k /我们可以通过k的每一个元素的值看出正好是v中每个元素在u中的索引号
2 0 2 0 1 3 2 0 0 0 2 2 1 0 0 3 0 1 3 0 1 3 0 3 0 2 1 0 0 2 0 2 2 0 1 3 2 3 2 2 1 2 0 0 3 0 3 3 0..
q)u[k]
`samsung`huawei`samsung`huawei`apple`oppo`samsung`huawei`huawei`huawei`samsung`samsung`apple`huaw..

通过上面的例子我们就可以将1000000个数据标准化为一个数值的列表,这样我们有时候处理起来就会更加的方便。

3. 利用symbol数据类型进行枚举

我们利用$操作符来进行枚举,假设v是我们一个股票的实时数据,u是我们股票的名称列表。则枚举的操作为`u$v,这里需要注意的是v中的所有数据都应该在u中有对应的值,否则就不是枚举,也会报错。

q)v
`samsung`huawei`samsung`huawei`apple`oppo`samsung`huawei`huawei`huawei`samsung`samsung`apple`huaw..
q)u
`huawei`apple`samsung`oppo
q)`u$v
`u$`samsung`huawei`samsung`huawei`apple`oppo`samsung`huawei`huawei`huawei`samsung`samsung`apple`h..
q)em:`u$v
q)`int$em
2 0 2 0 1 3 2 0 0 0 2 2 1 0 0 3 0 1 3 0 1 3 0 3 0 2 1 0 0 2 0 2 2 0 1 3 2 3 2 2 1 2 0 0 3 0 3 3 0..
q)em:`u$`xiaomi /xiaomi这个数据并没有在u中有对应的元素,因此枚举时就报错
'cast

4. 枚举的使用

q)u:`huawei`apple`samsung`oppo
q)v:1000000?u
q)v
`oppo`oppo`huawei`apple`apple`huawei`samsung`samsung`apple`apple`apple`samsung`huawei`samsung`app..
q)em:`u$v /创建枚举类型的em变量
q)v[3] /查询列表v中的第四个数据
`apple
q)em[3]  /查询枚举变量em中的第四个数据,返回结果与v的都是apple
`u$`apple
q)v=`oppo /查看v中所有那些元素值是oppo
1100000000000000000110000010000011011000000001001100000111000100011001011000000110100011000000000..
q)em=`oppo  /查看em中所有那些元素值是oppo
1100000000000000000110000010000011011000000001001100000111000100011001011000000110100011000000000..
q)where v=`apple  /查看v中所有那些元素值是apple,并返回索引号
3 4 8 9 10 14 22 23 27 28 29 34 38 39 40 42 59 62 67 68 70 73 83 84 85 88 90 92 96 98 99 102 103 ..
q)where em=`apple /查看em中所有那些元素值是apple,并返回索引号
3 4 8 9 10 14 22 23 27 28 29 34 38 39 40 42 59 62 67 68 70 73 83 84 85 88 90 92 96 98 99 102 103 ..
q)v=em /从表面上看v和em似乎是相等的
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111..
q)v~em /但是只是值相等,数据类型并不相同
0b
q)type v /列表v的数据类型num为11h
11h
q)type em /枚举类型em的数据类型num为20h
20h

5. 更新枚举的列表

现在假设apple公司改名了,叫appleone,我们这时候只需要更新u中的数据就可以了。

q)u[1]:`appleone /apple公司的名称还成了appleone
q)u
`huawei`appleone`samsung`oppo
q)v /我们发现v中的数据apple并没有改变appleone
`oppo`oppo`huawei`apple`apple`huawei`samsung`samsung`apple`apple`apple`samsung`huawei`samsung`app..
q)em /但是枚举em中的apple改成了appleone了
`u$`oppo`oppo`huawei`appleone`appleone`huawei`samsung`samsung`appleone`appleone`appleone`samsung`..

现在假设我们出现了一个新的公司叫xiaomi的,我们需要先给u中添加xiaomi,然后才能给em中添加xiaomi这个元素。

q)u
`huawei`appleone`samsung`oppo
q)u,:`xiaomi /给u中添加xiaomi
q)u
`huawei`appleone`samsung`oppo`xiaomi
q)em,:`xiaomi /这个时候我们就可以给em中添加xiaomi了
q)last em /利用last函数返回em中的最后一个元素
`u$`xiaomi
q)v,:`meizu /我们在没有给u中添加meizu的情况下可以随时给v中添加新的元素
q)em,:`meizu /我们在没有给u中添加meizu的情况下给em中添加新的元素,则返回`cast错误
'cast

6. 创建动态枚举

由于很多时候我们不清楚未来的情况,因此我们可以创建动态的枚举类型。

q)company:() /创建一个空列表作为原数据
q)`company$`g /这个时候我们利用元数据列表company创建枚举类型,由于列表中没有`g这个元素,因此报错
'type
q)`company?`huawei  /这个时候我们可以通过?操作符代替$操作符来创建枚举类型,同时这时也会自动将huawei添加到原数据当中。
`company$`Huawei  /返回一个枚举的类型
q)company /这时我们查看原数据中,发现已经添加了huawei这个元素
,`huawei
q)`company?`apple`IBM /同理我们也可以同时添加多个元素来创建枚举类型
`company$`apple`IBM
q)company
`huawei`apple`IBM
q)`company?`huawei`xiaomi /我们添加一个存在的和不存在元素
`company$`huawei`xiaomi
q)company /在原数据中不会重复添加相同元素的
`huawei`apple`IBM`xiaomi
q)em:`company?`huawei`xiaomi
q)em
`company$`huawei`xiaomi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值