各位大虾,我想问一下,数据库中有起始和完成时间如何将这两个时间做差后,分别得到年,月,日的值,后面要用到这三个差值写到对应的三个年月日的编辑框中,我想知道如何从数据库中取得时间后做差分别得到年月日的差值

解决方案 »

  1.   

    DecodeDate(TDateTime Date, Word &Year, Word &Month, Word &Day);
      

  2.   

    ADOQuery1.SQL.Add('select date1,date2,DateDiff("yyyy",Date2,Date1)' as Years from main where name='''admin''');这样就能将date2比date1多的年份取出来放入years里面显示出来了
      

  3.   

    使用DateDiff函数后需要自己处理各种情况DateDiff 函数 描述
    返回两个日期之间的时间间隔。 
    语法
    DateDiff(interval, date1, date2 [,firstdayofweek][, firstweekofyear]])
    DateDiff 函数的语法有以下参数:参数 描述 
    interval 必选。字符串表达式,表示用于计算 date1 和 date2 之间的时间间隔。有关数值,请参阅“设置”部分。 
    date1, date2 必选。日期表达式。用于计算的两个日期。 
    firstdayofweek 可选。指定星期中第一天的常数。如果没有指定,则默认为星期日。有关数值,请参阅“设置”部分。 
    firstweekofyear 可选。指定一年中第一周的常数。如果没有指定,则默认为 1 月 1 日所在的星期。有关数值,请参阅“设置”部分。 
    设置
    interval 参数可以有以下值:
    设置 描述 
    yyyy 年 
    q 季度 
    m 月 
    y 一年的日数 
    d 日 
    w 一周的日数 
    ww 周 
    h 小时 
    m 分钟 
    s 秒 在 interval 为“年”(“yyyy”)时,比较 12 月 31 日和来年的 1 月 1 日,虽然实际上只相差一天,DateDiff 返回 1 表示相差一个年份。
      

  4.   

    数据库不同,函数也不一样
    从数据库里取出来后,在程序里操作
    比如
    var
      d1, d2 :TDateTime;
      yy, mm, dd :Word;  d1 := xxx.fieldbyName('startdate').asDateTime;
      d2 := xxx.fieldbyName('enddate').asDateTime;
      decodedate(d2-d1, yy, mm, dd);
      

  5.   

    用decode得到的yy,mm,dd都是word型的怎么变为string型的值啊,我用的数据库是sqlserver,还有个要求就是相减得到的不足十的值前面要有0,比如得到6,要写为06
      

  6.   

    单独各个部分来计算的方法:
    例如:SELECT DATEDIFF(yyyy, '2020-6-2 9:00:00', '2006-6-2 9:00:00') AS year
          得到的结果就是-14
          SELECT DATEDIFF(mm, '2020-6-2 9:00:00', '2006-6-2 9:00:00') AS month
          得到的结果就是-168SELECT DATEDIFF(yyyy, 开始时间, 结束时间) AS year,DATEDIFF(mm, 开始时间, 结束时间) AS month,DATEDIFF(dd, 开始时间, 结束时间) as day from 表名作为一个整体来计算的方法
          select DATEPART(month, '2020-6-2 9:00:00')-DATEPART(month, '2006-6-2 9:00:00')
          得到的结果就是0
      

  7.   

    用decode得到的yy,mm,dd都是word型的怎么变为string型的值啊,
    -----------------
    stryy := IntToStr(yy);我用的数据库是sqlserver,
    ----------------------
    sqlserver可以用DATEDIFF函数还有个要求就是相减得到的不足十的值前面要有0,比如得到6,要写为06
    ---------------------
    strmm := Copy('0'+IntToStr(mm), 1, 2);
    或者用Format
      

  8.   

    ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Text:='select datediff(dd,TASK_STIME,TASK_ETIME) as day from MSN_TASK where TASK_NUM = :p1'; //      TASK_STIME,TASK_ETIME为数据库表中对应的开始和结束时间的名称,MSN_TASK为表名
        ADOQuery1.Parameters.Items[0].Value := TaskN;
        ADOQuery1.Open;
        Combo_Day.Text:=ADOQuery1.Fields[0].AsString;//将得到的日的差放进编辑框
    这样编,编译后出来的结果还是不对啊,我是不是哪没写对啊,大家帮我看看吧