一、日期时间
1.获取当前系统时间
SELECT current timestamp FROM sysibm.sysdummy1;
2.日期时间格式化
select to_char(currentdate, 'YYYYMMDD') from tblname;
-- 或者
select to_char(date(xxxdate), 'YYYYMMDD') from tblname;
之所以写下这个是因为我看到我们项目中的shell脚本中,查询会计日期的方法是这样的:
select substr(char(year(txdate) * 10000 + month(txdate) * 100 + day(txdate)), 1, 8) from sys_date;
看到这样的sql不免让我们眉头一皱,愕然一笑,然后就释然了。不过我们只需要记录一下比较优雅准确的方法即可。
Ps:日期减去一天的方法我们下面介绍,当然比较不优雅而且会被后来者讥讽的做法就是把上面那一条sql的txdate直接减-即可,我们项目中也是这么做的。是的,你没看错,银行的项目,什么性能、优雅、扩展性、维护性等等,基本上通通不要也无需考虑,因为你唯一需要考虑的就是怎么把任务既快又正确地完成,不然你会被屌丝的很惨,除非你遇到一个比较好的或者说有代码洁癖的领导。
上面介绍了日期格式化,如果是日期时间格式化道理也是一样的,只需要把括弧中的date修改成timestamp即可。
3.日期时间加减
select * from tblname where upd_time - current_time> 0;
// 或者
select * from tblname where upd_time - '2021-07-08 16:15:30'> 0;
//或者
select * from tblname where upd_time - timestamp ('2021-07-08 16:17:30')> 0;
// 加法,休息年月日中的s
select updtime + 1 year from tblname;
select updtime + 2years +2months -20days from tblname;
日期同理,不再赘述。
4.获取年、月、日、时、分、秒
具体的格式是:
// 年
Year(updtime) = '2021';
// 月
Month(updtime) > '07';
// 日
Day(updtime) = '10';
// 时,此处的hour不要加s
Hour(updtime) = '16';
// 分
Minute(updtime) > '30';
//秒
Second (updtime) > '30';
其他更细小的时间单位类似,这里不再赘述,需要的朋友可以自行尝试。
如果需要两个时间具体相差多少单位,也就是说相差多少天,或者多少小时,可以采用这样的方式:
Select day (updtime) - day (current date) from tblname;
5.截取其实时间
Date (current timestamp)
// 或者
Time (current timestamp)
二、DDL
具体sql如下:
1.修改字段长度或类型
Alter TABLE tblname alter column fieldname set data type varchar (100);
2.删除字段
ALTER TABLE 表名 DROP 列名;
3.增加字段
Alter table 表名 add column 列名 varchar(100);
三、DB2常用操作
1.去除换行符和回车
是否有换行符和回车可以把数据粘贴到notepad++中,然后选择视图——显示符号——显示所有字符。如果数据有换行符,一般会有CRLF,意思是回车键和换行符。
去除回车换行符方法:
REPLACE (REPLACE (REPLACE (列名,CHR (13) ‖CHR (10), ‘’),CHR (13), ‘’), CHR (10),’’);
2.刷新表(REORG)
对数据库的表结构进行修改之后,必须进行reorg操作,不然会出现表不活跃甚至锁表的情况,直观的结果便是无法增删改数据,甚至查询也会报错。这种情况的db2错误码一般情况下都是:57016。
刷新表当然是reorg命令,但是在不同的地方(操作的目标对象上)命令也会有所差异。
在服务器上使用命令行刷新表:
db2 reorg table 表名;
在数据库客户端使用sql刷新表:
call sysproc.admin_cmd('reorg table 表名');
在SQL文件中:
db2 reorg table tblname;
注意:
在服务器上的操作,必须加’db2’,比如修改字段类型:
db2 ‘alter table tblname alter column set data type varchar (100)’;
切记,必须加db2,而且一般情况下之后的sql必须引号括起来。服务器上刷新表(reorg)db2 reorg table tblname或者db2 ‘reorg table tblname’都可以。
3.shell脚本中连接数据库:
db2 connect to 数据库名 user 用户名 using 密码;
不过shell脚本中的数据库名、用户、密码这三项基本不可能在脚本中明文显示,都是通过引入公共文件的形式,然后使用公共文件中配置好的变量即可。
简而言之,从配置文件中获取。比如:
// 引入公共文件
. /home/xxx/xx/shell/head.lib
连接数据库:
db2 "connect to $DB_NAME user $DB_USERNAME using $DB_PASSWORD"
这其中$开头的都是从公共文件中读取的。
我们从服务器上找到对应的head.lib文件,然后用notepad++打开,可以发现其中配置了很多信息,依然也包括刚才我问说的数据库相关的几个。虽然是lib文件,但是其实就是一个shell脚本而已。
4.查询某一列不为空的数据
select * from tblname where 列名 is not null;
5.查询前10条数据
select * from tblname fetch first 10 rows only;
6.服务器上显示表空间详情:
db2 list tablespaces show detail;
// 或者
db2 ‘list tablespaces show detail’;
7.服务器上执行sql文件
db2 -tvf 文件名;
注意:
凡是提到在服务器上执行的sql操作必须先连接服务器,方法和3一样,也就是和shell的操作一样。
任何需要在服务器上执行的sql脚本,都需要加强db2这三个字母,其后的sql最好都带上引号。如果你问我为什么这么强调,我只能告诉你,我就干过这种不带db2这个单词的操作,直接一条干巴巴的sql在服务器上执行,结果当然会报错了。我试过带db2,不带db2,带引号,不带引号,最后的结论是:在服务器上带上db2和引号吧!如果是投产SQL,生产上是直接读文件,执行sql文件中的SQL脚本,这个sql脚本和我们平时在数据库客户端上的命令是一致的(个人认为没有区别,有人说不一致——其实他们也不清楚,Ps:我也不清楚,不过无所谓了)。这个SQL文件中的sql就不要带db2三个字母了,因为最终是执行里面的sql的。
8.查询指定行数的数据
Select * from (select row_number() over (order by updtime) as rownm, * from tblname) where rownm = 10;
9.查询数据库锁的情况
Select * from sysibmadm.locks_held with ur;
10.新增字段,设置非空与默认值
Alter table tblname add 列名 varchar(30) not null default '0';
11.给表添加备注
Comment on table 表名 is 'xxx';
12.给表中的字段添加备注
Comment on column 表名.列名 is 'xxx';
给表和字段添加备注一般是在我们创建表的时候、修改字段或者备注的时候。最好把备注添加好,我见过很多表,光秃秃的,除了英文没有见一个中文,给使用者带来巨大的不便。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/2735.html