免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 爱随柳飘
打印 上一主题 下一主题

请教编程 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-03-25 17:00 |只看该作者
原帖由 爱随柳飘 于 2006-3-24 21:30 发表
snow888
光明使者
能不能直接输入如“19840308”和“19990526”。
再相-


int
date_diff( char *s_dt,char *e_dt )
{

long t1,t2;

rdefmtdate( &t1,"YYYYMMDD",s_dt );
rdefmtdate( &t2,"YYYYMMDD",e_dt );

return( t2-t1 );

}

printf( "%d\n",date_diff( s_dt,e_dt ));

论坛徽章:
0
12 [报告]
发表于 2006-03-25 17:09 |只看该作者
原帖由 FH 于 2006-3-24 22:08 发表


这个需要安装informix,是俺见过的最笨的方法


呵呵,你以为是select to_char( rq,"%Y%m%d" ) from table; 啊???
别自以为是,好不好。。

LZ提的问题中是求日期间隔,所以可能存在参数的数据类型可能是从库里面查出来,也有可能是字符串,我的做法是只是先把数据类型转换成cha[8+1]的日期。

FH很牛吗?

论坛徽章:
0
13 [报告]
发表于 2006-03-25 22:53 |只看该作者
原帖由 sishanji 于 2006-3-25 17:09 发表


呵呵,你以为是select to_char( rq,"%Y%m%d" ) from table; 啊???
别自以为是,好不好。。

LZ提的问题中是求日期间隔,所以可能存在参数的数据类型可能是从库里面查出来,也有可能是字符串, ...


rdefmtdate是informix的函数吧?
如果用informix,还需要用字符串再转来转去吗?
FH不牛,只是informix玩了10年了,对里面的函数很清楚。

论坛徽章:
0
14 [报告]
发表于 2006-03-25 23:00 |只看该作者
LZ只是说两个日期,并没有说日期的表达方式或存储格式,如果是time_t格式的,那么(t1-t2)/(24*60*60)就是两个日期相差的天数。

论坛徽章:
0
15 [报告]
发表于 2006-03-25 23:19 |只看该作者
不知道是否有漏洞, 楼主自己测试看看。如果早于1970 则调整一下 for(id=1970;id<day/10000;id++) 这一句。


  1. #include <stdio.h>

  2. int get_day_off(int day)
  3. {
  4. int id,tot=0;

  5.   for(id=1970;id<day/10000;id++)
  6.   {
  7.     if((id%400==0)||((id%4==0)&&(id%100!=0)))
  8.       tot+=366;
  9.     else
  10.       tot+=365;
  11.   };
  12.   for(id=1;id<day/100%100;id++)
  13.   {
  14.     switch(id)
  15.     {
  16.       case 1:
  17.       case 3:
  18.       case 5:
  19.       case 7:
  20.       case 8:
  21.       case 10:
  22.       case 12:
  23.         tot+=31;
  24.         break;
  25.       case 4:
  26.       case 6:
  27.       case 9:
  28.       case 11:
  29.         tot+=30;
  30.         break;
  31.       case 2:
  32.         if((day/10000%400==0)||((day/10000%4==0)&&(day/10000%100!=0)))
  33.           tot+=29;
  34.         else
  35.           tot+=28;
  36.     };
  37.   };
  38.   tot+=day%100;
  39.   return tot;
  40. };

  41. int main(int argc, char* argv[])
  42. {
  43. char a[20],b[20];
  44. int  ia,ib,off;

  45.   strcpy(a,"19840308");
  46.   strcpy(b,"19990526");

  47.   sscanf(a,"%d",&ia);
  48.   sscanf(b,"%d",&ib);

  49.   off=get_day_off(ib)-get_day_off(ia);
  50.   printf("off is %d\n",off);
  51.   return 0;
  52. }
复制代码


SQL> select to_date('19990526','yyyymmdd') - to_date('19840308','yyyymmdd') from
dual;

TO_DATE('19990526','YYYYMMDD')-TO_DATE('19840308','YYYYMMDD')
-------------------------------------------------------------
                                                         5557

这个是对的。

论坛徽章:
0
16 [报告]
发表于 2006-03-26 08:20 |只看该作者

回复 8楼 hkwang66 的帖子

20行就行了吗?

能不能写一下其代码?

邮箱是:wsq5676543@163.com

3Q

论坛徽章:
0
17 [报告]
发表于 2006-03-26 08:39 |只看该作者

回复 15楼 mengwg 的帖子

好的,我试试

论坛徽章:
0
18 [报告]
发表于 2006-03-26 08:44 |只看该作者

回复 15楼 mengwg 的帖子

用C++运行时有一处错误
.cpp(49) : error C2065: 'strcpy' : undeclared identifier
执行 cl.exe 时出错.

日期.obj - 1 error(s), 0 warning(s)

我还没怎么用C++

这个应该是用C++的吧,输出,输入语句都要用#include"stdio.h"

论坛徽章:
0
19 [报告]
发表于 2006-03-26 11:18 |只看该作者
#include <string.h>

论坛徽章:
0
20 [报告]
发表于 2006-03-26 11:49 |只看该作者
哦,你把它们当成字符数组来搞啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP