当前位置: 代码迷 >> Java Web开发 >> 关于日期连续显示有关问题
  详细解决方案

关于日期连续显示有关问题

热度:182   发布时间:2016-04-17 17:16:32.0
关于日期连续显示问题
问题描述:
我用的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   &lt;=   @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
  相关解决方案