我认为很清楚,但似乎并非如此。 这个问题是关于T-SQL(因为它用tsql标记:))
所以我找不到任何开箱即用的解决方案来计算我的问题。
我们假设您有这两个日期时间:
DECLARE @start DATETIME = '2011-01-01',
@end DATETIME = '2011-04-15'
这两个日期在天中的差异应该是等于105。
计算方法如下:每个完整月份增加30天,其余时间添加日期直到达到日期。
我可以编程,但这将是一个巨大的SQL语句,我发现它有点难看。
是否有任何简单的解决方案,如内置函数或简短的东西?
提前致谢。
答案 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
函数会产生不同的结果。
希望这有帮助。