计算两个时间相差多少年月日的sql算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算两个时间相差多少年月日的sql算法相关的知识,希望对你有一定的参考价值。
如:起始时间 2011-1-1 截止日期 2011-2-1 两个时间比较相差 0年1个月 如:起始时间 2010-11-1 截止日期 2011-12-1 两个时间比较相差 1年1个月 怎么比较才能得出~ 相差多少年 多少个月 这个当然很简单, 一句SQL就可以了:select ltrim(datediff(yy,@dt1,@dt2))+'年'+ltrim(datediff(mm,@dt1,@dt2)%12)+'月'但是如果连几天也要计算呢?闲着没事自己随便在SQL Server下写了写,store procedures代码如下,应该没可以了:CREATE PROCEDURE GetDateDiff
@fromDate nvarchar(10),
@toDate nvarchar(10)
AS
DECLARE @YearDiff INTEGER
DECLARE @MonthDiff INTEGER
DECLARE @DayDiff INTEGER
DECLARE @ToMonth INTEGER
DECLARE @FromDay INTEGER
DECLARE @ToDay INTEGER
SET @YearDiff = LTRIM(DATEDIFF(yy, @fromDate, @toDate))
SET @MonthDiff = LTRIM(DATEDIFF(mm, @fromDate, @toDate)%12)
SET @ToMonth = Month(cast(@toDate as Datetime))
SET @FromDay = Day(cast(@fromDate as Datetime))
SET @ToDay = Day(cast(@ToDate as Datetime))
IF (@ToDay - @FromDay) < 0
BEGIN
IF (@ToMonth - 1) = 1 OR (@ToMonth - 1) = 3 OR (@ToMonth - 1) = 5 OR (@ToMonth - 1) = 7 OR (@ToMonth - 1) = 8 OR (@ToMonth - 1) = 10 OR (@ToMonth - 1) = 12
BEGIN
SET @DayDiff = 31 + @Today - @FromDay
SET @MonthDiff = @MonthDiff -1
END
ELSE
BEGIN
SET @DayDiff = 30 + @Today - @FromDay
SET @MonthDiff = @MonthDiff -1
END
END
ELSE
BEGIN
SET @DayDiff = @Today - @FromDay
END
SELECT CAST(@YearDiff AS NVARCHAR(10)) + '年' + CAST(@MonthDiff AS NVARCHAR(10)) + '月' + CAST(@DayDiff AS NVARCHAR(10)) + '日' 参考技术A SELECT CAST(@YearDiff AS NVARCHAR(10)) + '年' + CAST(@MonthDiff AS NVARCHAR(10)) + '月' + CAST(@DayDiff AS NVARCHAR(10)) + '日'!
c语言如何计算两个时间相差多少
比如我想计算5:34:30到19:33:34 这之间经过了多少小时多少分钟,多少秒。现在我只能把时间print出来,请问接下来要怎么来计算时间差呢
#include <stdio.h>
int main()
struct time
int hour;
int minute;
int second;
;
struct time t1,t2;
printf("please input the structure time1:");
scanf("%d %d %d",&t1.hour,&t1.minute,&t1.second);
printf("please input the structure time2:");
scanf("%d %d %d",&t2.hour,&t2.minute,&t2.second);
printf("t1=%d:%d:%d,t2=%d:%d:%d\n",t1.hour,t1.minute,t1.second,t2.hour,t2.minute,t2.second);
return 0;
多谢各位大神!
/**
time.c
定义一个结构体实现两个时间的加减
*/
#include<stdio.h>
#include<string.h>
typedef struct
int seconds;
int minutes;
int hours;
Time;
int checkTime(Time time);
void printTime(Time time);
void swap(Time *time1,Time *time2);//大的时间放在前面
Time subtract1(Time *first,Time *second);
Time subtract(Time *first,Time *second);//默认第一个时间比第二个大
int main()
Time time1;
Time time2;
Time time3;
char againch[5]="y";
while(strcmp(againch,"y")==0||strcmp(againch,"Y")==0)
int again=1;
while(again)
printf("输入时间1:");
scanf("%d:%d:%d",&time1.hours,&time1.minutes,&time1.seconds);
if(checkTime(time1))
printf("-----输入时间格式错误!请重新输入\\n");
again=1;
else
again=0;
again=1;
while(again)
printf("输入时间2:");
scanf("%d:%d:%d",&time2.hours,&time2.minutes,&time2.seconds);
if(checkTime(time2))
printf("-----输入时间格式错误!请重新输入\\n");
again=1;
else
again=0;
swap(&time1,&time2);
printf(" ");
printTime(time1);
printf(" - ");
printTime(time2);
time3=subtract(&time1,&time2);
printf(" = ");
printTime(time3);
printf("\\n");
printf("继续[y/n]?:");
scanf("%s",againch);
return 0;
//检查时间的格式
int checkTime(Time time)
// printf("小时格式错误:%d\\n",(time.hours>=24||time.hours<0));
// printf("分钟格式错误:%d\\n",(time.minutes>=60||time.minutes<0));
// printf("秒格式错误 :%d\\n",(time.seconds>=60||time.minutes<0));
return ((time.hours>24||time.hours<0)||(time.minutes>=60||time.minutes<0)||(time.seconds>=60||time.minutes<0));
//输出按个数输出时间
void printTime(Time time)
printf("%d:%d:%d",time.hours,time.minutes,time.seconds);
//大的时间放到第一个变量,小的时间方法哦第二个变量
void swap(Time *time1,Time *time2)
//保证第一个时间永远大于第二个时间
if(time2->hours>time1->hours)//如果有time
//交换两个时间的小时
time2->hours^=time1->hours;
time1->hours^=time2->hours;
time2->hours^=time1->hours;
//交换两个时间的分钟:
time1->minutes^=time2->minutes;
time2->minutes^=time1->minutes;
time1->minutes^=time2->minutes;
//交换两个时间的秒:
time1->seconds^=time2->seconds;
time2->seconds^=time1->seconds;
time1->seconds^=time2->seconds;
else if(time2->minutes>time1->minutes&&time1->hours==time2->hours)
//交换两个时间的分钟:
time1->minutes^=time2->minutes;
time2->minutes^=time1->minutes;
time1->minutes^=time2->minutes;
//交换两个时间的秒:
time1->seconds^=time2->seconds;
time2->seconds^=time1->seconds;
time1->seconds^=time2->seconds;
else if(time2->seconds>time1->seconds&&time1->minutes==time2->minutes)
//交换两个时间的秒:
time1->seconds^=time2->seconds;
time2->seconds^=time1->seconds;
time1->seconds^=time2->seconds;
//计算两个时间的差
Time subtract(Time *first,Time *second)//默认第一个时间比第二个大
Time result;
//先对秒进行相减
if(first->seconds>=second->seconds)//如果第一个秒大于或者等于
result.seconds=first->seconds-second->seconds;
else//如果第一个的秒数小的话
first->minutes=first->minutes-1;//借位
first->seconds=first->seconds+60;
result.seconds=first->seconds-second->seconds;
//接着对分钟相减
if(first->minutes>=second->minutes)//如果第一个秒大于或者等于
result.minutes=first->minutes-second->minutes;
else//如果第一个的秒数小的话
first->hours=first->hours-1;//借位
first->minutes=first->minutes+60;
result.minutes=first->minutes-second->minutes;
//交换后 默认第一个小时会大于第一个,没有借位的情况,不用
result.hours=first->hours-second->hours;
return result;
拓展资料
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
任意输入两个24小时制的时间,输出两个时间的时间差;
return 0;
//检查时间的格式
int checkTime(Time time)
// printf("小时格式错误:%d\\n",(time.hours>=24||time.hours<0));
// printf("分钟格式错误:%d\\n",(time.minutes>=60||time.minutes<0));
// printf("秒格式错误 :%d\\n",(time.seconds>=60||time.minutes<0));
return ((time.hours>24||time.hours<0)||(time.minutes>=60||time.minutes<0)||(time.seconds>=60||time.minutes<0));
//输出按个数输出时间
void printTime(Time time)
printf("%d:%d:%d",time.hours,time.minutes,time.seconds);
//大的时间放到第一个变量,小的时间方法哦第二个变量
void swap(Time *time1,Time *time2)
//保证第一个时间永远大于第二个时间
if(time2->hours>time1->hours)//如果有time
//交换两个时间的小时
time2->hours^=time1->hours;
time1->hours^=time2->hours;
time2->hours^=time1->hours;
//交换两个时间的分钟:
time1->minutes^=time2->minutes;
time2->minutes^=time1->minutes;
time1->minutes^=time2->minutes;
//交换两个时间的秒:
time1->seconds^=time2->seconds;
time2->seconds^=time1->seconds;
time1->seconds^=time2->seconds;
else if(time2->minutes>time1->minutes&&time1->hours==time2->hours)
测试:
参考技术B 主要可以通过两种方法实现,第一种直接计算,第二种通过difftime函数实现,具体代码如下,
//函数功能计算两个时间差,未考虑时间数据有效性
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main(int argc, char *argv[])
struct time1
int hour;
int minute;
int second;
;
struct time1 t1,t2;
struct tm *ptr1,*ptr2;
time_t lt;
time(<);//当前系统时间
ptr1=localtime(<);//返回指向当前时间的指针
ptr2=(struct tm *)malloc(sizeof(struct tm));//动态申请指针ptr2
memcpy(ptr2,ptr1,sizeof(struct tm));//复制ptr1
long diff=0;//存储时间差
//第一种方法,直接计算
printf("please input the structure time1:");
scanf("%d %d %d",&t1.hour,&t1.minute,&t1.second);
printf("please input the structure time2:");
scanf("%d %d %d",&t2.hour,&t2.minute,&t2.second);
printf("t1=%d:%d:%d,t2=%d:%d:%d\n",t1.hour,t1.minute,t1.second,t2.hour,t2.minute,t2.second);
diff=(t1.hour*3600+t1.minute*60+t1.second)-(t2.hour*3600+t2.minute*60+t2.second);
diff=(diff>0)?diff:(-1*diff);
printf("1. diff=%ld\n",diff);
//第二种方法,通过difftime计算
ptr1->tm_sec=t1.second;//更改当前时间为t1,struct tm结构其他成员不变
ptr1->tm_min=t1.minute;
ptr1->tm_hour=t1.hour;
ptr2->tm_sec=t2.second;//更改当前时间为t2
ptr2->tm_min=t2.minute;
ptr2->tm_hour=t2.hour;
diff=(long)difftime(mktime(ptr2),mktime(ptr1));
printf("2. diff=%ld\n",diff);
return 0;
double difftime( time_t time2, time_t time1 );函数返回时间参数time2和time1之差的秒数表示。
结构体tm定义如下,
struct tm
int tm_sec; /* 秒–取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值从1900开始 */
int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数–取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/
const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/
; 参考技术C 把t1和t2中间的时间全部折算成秒,然后使用秒数相减,最后折算回时分秒就行了。 参考技术D #include <stdio.h>
struct time
int hour;
int minute;
int second;
;
int main(int argc, const char * argv[])
int sum1;
int sum2;
int sum;
struct time t1,t2;
printf("please input the structure time1:");
scanf("%d %d %d",&t1.hour,&t1.minute,&t1.second);
printf("please input the structure time2:");
scanf("%d %d %d",&t2.hour,&t2.minute,&t2.second);
printf("t1=%d:%d:%d,t2=%d:%d:%d\n",t1.hour,t1.minute,t1.second,t2.hour,t2.minute,t2.second);
sum1=(t1.hour)*60+(t1.minute)*60+t1.second;
sum2=(t2.hour)*60+(t2.minute)*60+t2.second;
sum=sum2-sum1;
if(sum<0)
sum=sum*(-1);
printf("%d",sum);
return 0;
printf("%d",sum);
本回答被提问者和网友采纳
以上是关于计算两个时间相差多少年月日的sql算法的主要内容,如果未能解决你的问题,请参考以下文章