在DB2下请高手指点按时间条件过滤的SQL

myheartzhang 2010-05-20 10:50:26
去查找上月最后一天的数据,
比如: 当前是2010年5月,那么上月最后一天是2010年4月30,当前是,2010年1月那么上月是,2009年12月31

在SERVER 2000下的语名是:
select *
from zz
where zz.rq = convert(varchar(10),dateadd(day,-day(getdate()),getdate()),112))

现在是2010年5月,这条语句: 从ZZ 表里去查找20100430所有的数据.rq 是字符型存放时间 格式为:YYYYMMDD

那位高手知道,在DB2 该怎么实现? 谢谢.

select *
from zz
where zz.rq IN (SELECT char(CURRENT DATE-day(CURRENT DATE) DAYS) FROM SYSIBM.SYSDUMMY1)

这样老是报错,哪位高手指点一下吧,
...全文
570 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwbhanye 2010-06-11
  • 打赏
  • 举报
回复
V9才开始有TO_CHAR()
V9以前肯定没有这个时间转换函数
iihero 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 efan101 的回复:]

iihero的想法是对的,不过转字符串,使用cast(column as varchar(8))就可以。to_char应该是9.5之后的版本才支持的。
SQL code
select cast((current date -day(current date)+1 days) as varchar from sysibm.sysdummy1;
[/Quote]
cast这后的格式没办法得到保障,请看我16楼的回贴。
王帆 2010-05-31
  • 打赏
  • 举报
回复
iihero的想法是对的,不过转字符串,使用cast(column as varchar(8))就可以。to_char应该是9.5之后的版本才支持的。
select cast((current date -day(current date)+1 days) as varchar from sysibm.sysdummy1; 
unicorn9966 2010-05-29
  • 打赏
  • 举报
回复
正有这个疑问,感谢受教了!谢谢
myheartzhang 2010-05-29
  • 打赏
  • 举报
回复
出差了,不好意思,几天没时间过来看.
luomf 2010-05-23
  • 打赏
  • 举报
回复
被人抢先了,呵呵
iihero 2010-05-23
  • 打赏
  • 举报
回复
如果再不行, 就创建一个格式化函数:ts_fmt,内容如下:
create function ts_fmt(TS timestamp, fmt varchar(20)) \
returns varchar(50) \
return \
with tmp (dd,mm,yyyy,hh,mi,ss,nnnnnn) as \
( \
select \
substr( digits (day(TS)),9), \
substr( digits (month(TS)),9) , \
rtrim(char(year(TS))) , \
substr( digits (hour(TS)),9), \
substr( digits (minute(TS)),9), \
substr( digits (second(TS)),9), \
rtrim(char(microsecond(TS))) \
from sysibm.sysdummy1 \
) \
select \
case fmt \
when 'yyyymmdd' \
then yyyy || mm || dd \
when 'mm/dd/yyyy' \
then mm || '/' || dd || '/' || yyyy \
when 'yyyy/dd/mm hh:mi:ss' \
then yyyy || '/' || mm || '/' || dd || ' ' || \
hh || ':' || mi || ':' || ss \
when 'nnnnnn' \
then nnnnnn \
else \
'date format ' || coalesce(fmt,' <null> ') || \
' not recognized.' \
end \
from tmp


然后可以执行:
db2 => select * from t where col2 = ts_fmt((current timestamp - day(current date) day), 'yyyymmdd')

ID COL2
----------- --------
2 20100430

1 record(s) selected.

db2 =>
这个应该支持低版本的db2.



这个跟
iihero 2010-05-23
  • 打赏
  • 举报
回复
执行:
select VARCHAR_FORMAT((current timestamp - day(current date) day), 'yyyymmdd') from sysibm.sysdummy1

试试
myheartzhang 2010-05-23
  • 打赏
  • 举报
回复
真有郁闷,这是怎么回事呢?
myheartzhang 2010-05-23
  • 打赏
  • 举报
回复
select to_char((current timestamp - day(current date) day), 'yyyymmdd') from sysibm.sysdummy1
只运行这句,
报错如下:
18:39:28 [SELECT - 0 row(s), 0.000 secs] [Error Code: -171, SQL State: 42815] DB2 SQL error: SQLCODE: -171, SQLSTATE: 42815,
SQLERRMC: 2;SYSIBM.TO_CHAR
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec [0 successful, 0 warnings, 1 errors]

iihero 2010-05-23
  • 打赏
  • 举报
回复
能执行一下语句:
select to_char((current timestamp - day(current date) day), 'yyyymmdd') from sysibm.sysdummy1
看看你那边是什么结果吗?
myheartzhang 2010-05-23
  • 打赏
  • 举报
回复
zzrzz 在库里的表为: DWADM.S_ZZRZZ

第一句,直截赋时间没有问题.


或改为,:
Select DWADM.S_ZZRZZ.jgbm AS JGDH
from DWADM.S_ZZRZZ
where DWADM.S_ZZRZZ.rq = cast('20100430' as decimal(8,0)) 也没问题.
myheartzhang 2010-05-23
  • 打赏
  • 举报
回复
Select DWADM.S_ZZRZZ.jgbm AS JGDH
from DWADM.S_ZZRZZ
where DWADM.S_ZZRZZ.rq = 20100430

表:zzrzz
jgbm char(9) 【机构编码】
rq decimal(8,0) 【日期】

然后,我转换成如下:
Select DWADM.S_ZZRZZ.jgbm AS JGDH
from DWADM.S_ZZRZZ
where DWADM.S_ZZRZZ.rq = cast(to_char((current timestamp - day(current date) day), 'yyyymmdd') as decimal(8,0))

报错
[Error Code: -171, SQL State: 42815] DB2 SQL error: SQLCODE: -171, SQLSTATE: 42815, SQLERRMC: 2;SYSIBM.TO_CHAR
iihero 2010-05-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 myheartzhang 的回复:]

我的DB2是8.2版的,不行呀,报错,
[SELECT - 0 row(s), 0.000 secs] [Error Code: -171, SQL State: 42815] DB2 SQL error: SQLCODE: -171, SQLSTATE: 42815, SQLERRMC: 2;SYSIBM.TO_CHAR
[/Quote]

你把你完整的SQL语句以及执行结果贴出来看看
myheartzhang 2010-05-23
  • 打赏
  • 举报
回复
iihero 你的DB2是不是9.0版本的? 为什么我的版本不行呢.
myheartzhang 2010-05-23
  • 打赏
  • 举报
回复
我的DB2是8.2版的,不行呀,报错,
[SELECT - 0 row(s), 0.000 secs] [Error Code: -171, SQL State: 42815] DB2 SQL error: SQLCODE: -171, SQLSTATE: 42815, SQLERRMC: 2;SYSIBM.TO_CHAR
iihero 2010-05-22
  • 打赏
  • 举报
回复
# myheartzhang
# (乔乔)
#
# 等 级:
# 结帖率:96.67%

何时结贴?:-)
mengzhisuoliu 2010-05-21
  • 打赏
  • 举报
回复
看看拉呵
iihero 2010-05-21
  • 打赏
  • 举报
回复
:) -
myheartzhang 2010-05-21
  • 打赏
  • 举报
回复
谢谢,iihero,指点.
加载更多回复(1)

5,891

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧