带小数的月份日期差异

时间:2015-05-28 07:16:39

标签: sql-server

我的查询如下:

SELECT DATEDIFF(MONTH, convert(datetime,'01/01/2015',103),convert(datetime,'15/02/2015',103) )

我的结果仅为1个月。

我需要得到1.5个月的结果。 (指1个月15天)。

我如何获得输出?

6 个答案:

答案 0 :(得分:6)

试试这个,它会计算一个月“使用”的确切百分比。它应该适用于所有日期。

DECLARE @from date = '2015-01-01'
DECLARE @to   date = '2015-02-15'

SELECT 
  datediff(month, @from, @to) - 1 +
  1-1.0*(day(@from)-1)/ day(dateadd(m, datediff(m,-1, @from), -1))
  + 1.0*(day(@to)-1)/ day(dateadd(m, datediff(m,-1, @to), -1))

结果:

1.5

请注意

from date = '2015-03-02'
to   date = '2015-04-02'

将在1.001075268817中给出略高于1的结果,因为在“从”之前已过去的行军月份的百分比小于在“到”之前的四月的百分比

答案 1 :(得分:3)

请改用:

SELECT DATEDIFF(d, convert(datetime,'01/01/2015',103),
                   convert(datetime,'15/02/2015',103) ) / 30.0

d代替month来获取天数。然后除以30可得到所需的结果。

注意您必须使用30.0而不是30才能避免整数除法。

答案 2 :(得分:2)

这将是更正确的解决方案:

SELECT  DATEDIFF(m, CONVERT(DATETIME, '01/01/2015', 103),
                 CONVERT(DATETIME, '15/02/2015', 103)) + 
        DATEPART(DAY, CONVERT(DATETIME, '15/02/2015', 103)) / 30.0

显示差异:

SELECT  DATEDIFF(d, CONVERT(DATETIME, '01/01/2015', 103),
                 CONVERT(DATETIME, '15/03/2015', 103)) / 30.0

2.433333

SELECT  DATEDIFF(m, CONVERT(DATETIME, '01/01/2015', 103),
                 CONVERT(DATETIME, '15/03/2015', 103)) + 
        DATEPART(DAY, CONVERT(DATETIME, '15/03/2015', 103)) / 30.0

2.500000

更准确地说,你可以不是30.0,而是上个月的天数:

SELECT  DATEDIFF(m, CONVERT(DATETIME, '01/01/2015', 103),
                 CONVERT(DATETIME, '15/02/2015', 103)) + 
        (DATEPART(DAY, CONVERT(DATETIME, '15/02/2015', 103))
        / (1.0*DATEDIFF(day, CONVERT(DATETIME, '15/02/2015', 103), dateadd(month, 1, CONVERT(DATETIME, '15/02/2015', 103)))))


1.53571428571428

修改

如果StartDate没有从第1天开始,那么此版本将无效!然后坚持让其他用户回答。

答案 3 :(得分:0)

试试这个:

SELECT DATEDIFF(d, convert(datetime,'01/01/2015',103),
   convert(datetime,'15/02/2015',103) ) / 30.0

即,您需要从DATEDIFF获取天数而不是月份,然后将其除以30以获得所需的输出。

答案 4 :(得分:0)

尝试在下面的查询中获取月份和日期:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let barViewControllers = segue.destination as? DetailsTabViewController {
               //Do your data pass / setup here

    }
}

答案 5 :(得分:0)

改进先前的answer

要计算月数,可以将其分为三个部分。从月初到月底的整个月的一部分,整个月以及最后一个月的一部分。

DECLARE @STARTDATE DATETIME = CONVERT(DATETIME, '22/01/2015', 103)
DECLARE @ENDDATE DATETIME = CONVERT(DATETIME, '15/03/2015', 103)

SELECT  -- Whole months
        DATEDIFF(m, @STARTDATE, @ENDDATE) - 1
        +
        -- Part of the month at beginning  of the period
        (1.0*((DAY(EOMONTH(@STARTDATE))) - DATEPART(DAY, @STARTDATE) + 1)
        / DAY(EOMONTH(@STARTDATE))) -- Number of days in first month
        + 
        -- Part of the month at the end of the period
        (1.0*DATEPART(DAY, @ENDDATE)
        / DAY(EOMONTH(@ENDDATE))) -- Number of days in last month

一个月中的天数可以通过两种方式计算:

 DAY(EOMONTH(@DATE))) 

OR

 (DATEDIFF(day, @DATE, dateadd(month, 1, @DATE)))