计算两个日期的差异,并且每个月都有30天

时间:2011-12-06 11:47:07

标签: tsql

我认为很清楚,但似乎并非如此。 这个问题是关于T-SQL(因为它用tsql标记:))

所以我找不到任何开箱即用的解决方案来计算我的问题。

我们假设您有这两个日期时间:

DECLARE @start DATETIME = '2011-01-01',
    @end DATETIME = '2011-04-15'

这两个日期在天中的差异应该是等于105。

计算方法如下:每个完整月份增加30天,其余时间添加日期直到达到日期。

我可以编程,但这将是一个巨大的SQL语句,我发现它有点难看。

是否有任何简单的解决方案,如内置函数或简短的东西?

提前致谢。

3 个答案:

答案 0 :(得分:1)

这可以解决这个问题吗?

;with dates as
(
SELECT
CAST ('2011-01-01' AS DATETIME) as start_date
,CAST('2011-04-15' AS DATETIME) as end_date
)
SELECT 
start_date
,end_date
,CASE WHEN DATEDIFF(MM,start_date,end_date) = 0 THEN DAY(end_date) - DAY(start_date) 
        WHEN DAY(start_date) = 1 THEN (30 * (DATEDIFF(MM,start_date,end_date))) + DAY(end_date) 
        WHEN DAY(start_date) <> 1 THEN  30 * DATEDIFF(MM,start_date,end_date) + (DAY(end_date) - DAY(start_date))
        END AS gap_in_days
FROM dates

答案 1 :(得分:0)

我使用PERIODDIFF。要获取日期的年份和月份,我使用函数EXTRACT

  SELECT PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months FROM your_table;

T-SQL

    SELECT DATEDIFF(dd, "2011-01-01","2011-04-15")

答案 2 :(得分:0)

简答

没有内置函数,但您可以非常轻松地创建自己的函数来处理将日期时间转换为int。从那里,您必须编写的SQL将是微不足道的。

长答案

没有内置功能可以做到这一点,可能是因为每个月有30天。 :)

你可以从这开始:

DECLARE @start DATETIME = '2011-01-01',
        @end DATETIME = '2011-04-15'

DECLARE @endConverted INT
SELECT @endConverted = DATEPART(month, @end) * 30 
                       + CASE 
                           WHEN DATEPART(DAY, @end) <= 30 
                             THEN datepart(DAY, @end)  
                           ELSE 30 
                         END

DECLARE @startConverted INT
SELECT @startConverted = DATEPART(MONTH, @start) * 30
                         + CASE
                             WHEN DATEPART(DAY, @start) <= 30
                               THEN DATEPART(DAY, @start)
                             ELSE 30
                           END

SELECT @endConverted - @startConverted

这不是很漂亮的SQL,但它有效。请注意,它返回104(因为15天 - 1天= 14天),但如果您希望以不同方式处理边界日,则很简单,可以在+ 1到最终选择的末尾。

请注意,此处的数学运算可以很容易地转移到一个函数中,这样可以让您清理SQL。假设您创建了一个名为GetDateTimeAsInt的函数来保存数学;你的SQL可以像

一样简单
DECLARE @start INT = GetDateTimeAsInt('2011-01-01'),
        @end INT = GetDateTimeAsInt('2011-04-15')

SELECT @end - @start -- may need to add 1 here

在我的测试中,这似乎有效。它将返回与您在帖子中指定的日期范围的DATEDIFF函数相同的结果,但这是因为有2天31天和1天28,所以有效,1月 - 4月有30天每。如果您使用更广泛的日期范围,我的代码与DATEDIFF函数会产生不同的结果。

希望这有帮助。