日期:2014-05-18  浏览次数:20774 次

关于日期连续显示问题
问题描述:
我用的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)
  END
select * from @t

------解决方案--------------------
生成时间基表,左连即可。


SQL code
DECLARE @st DATETIME,@et DATETIME,@n INT
SELECT @st='2009-3-1',@et='2009-3-22',@n =DATEDIFF(dd,'2009-3-1','2009-3-22') + 1 

SET ROWCOUNT @n
SELECT ID=IDENTITY(INT),dt = CAST(NULL AS DATETIME)  INTO #1 FROM sysobjects,syscolumns
UPDATE #1 SET dt = DATEADD(dd,ID-1,@st)
SET ROWCOUNT 0

SELECT a.dt,ISNULL(sm,0) 交易量 FROM #1 a
LEFT JOIN 
    (
    SELECT CONVERT(