首页 新闻 会员 周边

时间查询问题 可程序和sql来实现

0
悬赏园豆:80 [已解决问题] 解决于 2012-02-24 15:50

求jfqsrq 是开始时间 jfzzrq  是结束时间

   统计这些时间  具体要求是

    jfqsrq           j fzzrq

   2008-1-1     2008-3-31

   2008-4-1    2008 -6-30

   2008-8-1    2008-9-31

   2008 -10-1  2009-3-31

统计结果的应为

   2008-1-1     2008-6-30

   2008-8-1    2009 - 3-31

 拿上一条数据的jfzzrq 和下一条数据的jfqsrq 相比 相差一月或是不差就合并起来

可用程序和sql语句来实现

 

 

自己写的程序实现

 



1 publicstring GetJfmxBzsj(DataTable dt)
2 {
3 var result ="";
4 if (dt ==null)
5 return result;
6 elseif (dt.Rows.Count ==1)
7 {
8 result = GetSfyf(dt.Rows[0]["jfqsrq"].ToString(), dt.Rows[0]["jfzzrq"].ToString());
9 }
10 else
11 {
12 int i =0;
13 while (true)
14 {
15 var kssj = Convert.ToDateTime(dt.Rows[i]["jfqsrq"]);
16 var jssj = Convert.ToDateTime(dt.Rows[i]["jfzzrq"]);
17 for (; i < dt.Rows.Count -1; i++)
18 {
19 var temp = Convert.ToDateTime(dt.Rows[i +1]["jfqsrq"]);
20 //同年的时候 终止时间 是下条记录的起始时间的上月 则合并 不同年 上年的月份为12 下年为1月 则合并
21 if ((jssj.Year == temp.Year && jssj.Month +1== temp.Month) || (jssj.Year +1== temp.Year && jssj.Month ==12&& temp.Month ==1))
22 {
23 jssj = Convert.ToDateTime(dt.Rows[i +1]["jfzzrq"]);
24 }
25 else
26 {
27 result +=""+ GetSfyf(kssj.ToString(), jssj.ToString());
28 i = i +1;
29 break;
30 }
31 }
32 if (i == dt.Rows.Count -1) //最后一列
33 {
34 result +=""+ GetSfyf(dt.Rows[i]["jfqsrq"].ToString(), dt.Rows[i]["jfzzrq"].ToString());
35 break;
36 }
37 }
38 }
39 return result;
40 }
41
42
43 ///<summary>
44 /// 获取缴费月份段
45 ///</summary>
46 ///<param name="start">开始时间</param>
47 ///<param name="end">结束时间</param>
48 ///<returns></returns>
49 publicstring GetSfyf(string start, string end)
50 {
51 if (start ==""|| end =="")
52 return"";
53 var s = DateTime.Parse(start);
54 var e = DateTime.Parse(end);
55 if (s.Year == e.Year && s.Month != e.Month)
56 {
57 return e.Year.ToString().Trim() +""+"("+ s.Month.ToString().Trim() +"-"+ e.Month.ToString().Trim() +")月";
58 }
59 elseif (s.Year == e.Year && s.Month == e.Month)
60 {
61 return s.ToString("yyyy年MM月");
62 }
63 elseif (s.Year != e.Year)
64 {
65 return s.ToString("yyyy年MM月") +""+ e.ToString("yyyy年MM月");
66 }
67 return"";
68 }
Fry_CiCi的主页 Fry_CiCi | 初学一级 | 园豆:0
提问于:2011-03-16 16:10
< >
分享
最佳答案
0

随手写了个大概,程序中去做的,当然你可以sql写函数或者存储过程去实现

var str = string.Empty;

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                var jfqsrq = dt.Rows[i]["jfqsrq"];
                var jfzzrq = dt.Rows[i - 1]["jfzzrq"];
                if (Convert.ToDateTime(jfqsrq).Subtract(Convert.ToDateTime(jfzzrq)) <= TimeSpan.FromDays(30))
                {
                    str = dt.Rows[i - 1]["jfqsrq"] + "" + dt.Rows[i]["jfzzrq"];
                }
            }

dt是你查询出来的结果集,

最后str得到的就是你要的结果,再把它赋值给你需要的地方

收获园豆:50
peter cheng | 菜鸟二级 |园豆:431 | 2011-03-16 16:44
你的if判断
和我的
if ((jssj.Year == temp.Year && jssj.Month +1== temp.Month) || (jssj.Year +1== temp.Year && jssj.Month ==12&& temp.Month ==1))
是一样的效果 。。 程序考虑不够完善。结果也不是我想要的
Fry_CiCi | 园豆:0 (初学一级) | 2011-03-16 17:16
其他回答(2)
0

感觉有点意思,不过sql的还没想出来...程序的比较简单

只要把数据取出放到dataset里然后遍历这个就可以了.

收获园豆:5
comeonfyz | 园豆:14 (初学一级) | 2011-03-16 16:18
程序的 我也做了 不过感觉不怎么好 不知道sql中有办法实现没
我用的oracle 数据库
当然用sql解决的办法也是可以的
支持(0) 反对(0) Fry_CiCi | 园豆:0 (初学一级) | 2011-03-16 16:28
oracle 数据库没有用过,如果要用数据库的话要考虑游标了,不然不能和下一行的比较的吧。在我印象中没有这样的函数,
支持(0) 反对(0) comeonfyz | 园豆:14 (初学一级) | 2011-03-16 16:31
我看了一下那个lead 和lag 函数 似乎有这样的效果
支持(0) 反对(0) Fry_CiCi | 园豆:0 (初学一级) | 2011-03-16 16:34
0

sql语句也可以实现,思路:创建两个临时表,多加一个id字段,然后俩表进行关联,table1.id+1=table2.id;关联后的结果select出来,进行datediff比较,如果符合条件,就直接取出,如果不符合,就不作处理,可以使用case when语句

收获园豆:25
♂镜花水月♂ | 园豆:305 (菜鸟二级) | 2011-04-07 14:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册