问题描述:
我用的SQL server2000
数据库中有一个表:DAYPRODUCT
表中有一个日期字段:date
假如我要取3月1日到3月22日之间的数据,总共是22天
但这之间有些天数据库中没有记录:比方说3月14日 3月21日
但我想在做报表时 按时间升序排列即为:从3月1日到3月22日
对于没有记录的那两天,我想让他在报表中显示为0
报表的最终形式应为这样
时间 交易量
2008-03-01 500
2008-03-02 700
2008-03-03 550
。。。 。。。
2008-03-14 0
。。。 。。。
这个应该怎么样做啊
谢谢,大家指导一下,给点意见
------解决方案--------------------
这样的话 我估计你还要判断一下
就是大月31天 小月30天 润月28天 。。。 。。。
sql吗 有些难写。通过程序还是可以实现的。
------解决方案--------------------
确实很难,因为没有一张表保存了连续的日期,让sql造出两个缺失的日期很困难。
建议你从数据库中select出来以后,在程序中遍历结果的时候补足差值。
------解决方案--------------------
i agree
------解决方案--------------------
要么用程序作,要么用存储过程,要么用临时表
比如临时表,把3月1日到3月22日之间是22天日期存入
select a.日期, (case when a.日期 is null then 0 else a.交易量 end) from DAYPRODUCT a ritht join 临时表 b on a.日期 = b.日期
------解决方案--------------------
告诉你一个实现方法:
就是拼sql。
1、首先算出某月的天数。如,1月31天。
2、StringBuffer sb = new StringBuffer();
sb.append("select isnull((select 时间,交易量 from table where 时间='2008-03-01''),'0')");//先取3月1日的数据
3、然后循环剩余天数,假如还剩30天
for(int i=1;i<13;i++){
sb.append("union all select isnull((select 时间,交易量 from table where 时间='i'),'0')");//获取剩余天数
}
4、最后执行此sql即可。
------解决方案--------------------
漏洞百出啊,忘了c1增加了
- Java code
...Statememt stmt = yourConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY);ResutSet rs = stmt.executeQuery("select 时间,交易量 from 表 where convert(时间, char(10), 112) between '2008-03-01' and '2008-03-22' order by 时间"); //convert的参数不是112就是120,忘了,好久没用SQLServer,LZ自己查一下帮助Calendar c1 = new GregorianCalendar(2008, 2, 1);Calendar c2 = new GregorianCalendar(2008, 2, 22);Map<String, Integer> map = new HashMap<String, Integer>();//SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");String s1="", s2="";int v = 0;while (c1.before(c2) == false) { s1 = String.format("%1$tF", c1.getTime()); if (s1.equals(s2)) { map.put(s2, v); continue; } if (rs.next()) { s2 = String.format("%1$tF", rs.getDate("时间")); //时间为null字段应该没有吧,重复的时间如果有的话以下要修改,这里以不重复处理 v = rs.getInt("交易量"); if (s1.equals(s2)) { map.put(s2, v); } else if (s1.compareTo(s2) < 0) { //s1>s2的可能没有吧,按LZ的数据 map.put(s1, 0); } } else { map.put(s1, 0); } c1.add(Calendar.Date, 1);}for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.printf("%s, %d", entry.getKey(), entry.getValue());}...
------解决方案--------------------
给你提供个思路,先生成一张你想要的日期段的表,然后用这张表去LEFT JOIN 你真正的数据表,按日期字段进行关联即可
- SQL code
DECLARE @t TABLE ( Times DATETIME)DECLARE @starttiem DATETIME,@endtime DATETIME SELECT @starttiem = '2009-03-01', @endtime ='2009-03-22' WHILE @starttiem <= @endtime BEGIN INSERT INTO @t SELECT @starttiem SET @starttiem = CONVERT(VARCHAR(10),Dateadd(DAY,1,@starttiem),120) ENDselect * from @t
------解决方案--------------------
生成时间基表,左连即可。
- SQL code
DECLARE @st DATETIME,@et DATETIME,@n INTSELECT @st='2009-3-1',@et='2009-3-22',@n =DATEDIFF(dd,'2009-3-1','2009-3-22') + 1 SET ROWCOUNT @nSELECT ID=IDENTITY(INT),dt = CAST(NULL AS DATETIME) INTO #1 FROM sysobjects,syscolumnsUPDATE #1 SET dt = DATEADD(dd,ID-1,@st)SET ROWCOUNT 0SELECT a.dt,ISNULL(sm,0) 交易量 FROM #1 aLEFT JOIN ( SELECT CONVERT(VARCHAR(10),[date],120) dtYMD,SUM(交易量) sm FROM DAYPRODUCT WHERE [date] >=@st AND [date]<DATEADD(dd,1,@et) GROUP BY CONVERT(VARCHAR(10),[date],120) ) b ON b.dtYMD = dtDROP TABLE #1