DECLARE @InputPeriodStart DATE = '1/1/2014'
DECLARE @InputPeriodEnd DATE = '12/31/2014'
ROUND(CONVERT(DECIMAL, DATEDIFF(dd, @InputPeriodStart, @InputPeriodEnd)) / 30, 1) AS DECIMAL(18, 2))
这里的问题是并非每个月都有30天。那么如何才能使这个计算正常工作呢?
我需要删除ROUND()
,然后将30替换为每个月的实际天数。我不确定我是怎么做到的。
答案 0 :(得分:1)
这是你要找的吗?
DATEDIFF(mm, @InputPeriodStart, @InputPeriodEnd))
如果你想做一些奇怪的事情,比如调整一下你的“时期启动”所在的月份 - 那么你会进入一些奇怪的领域,但它仍然是可能的。只需删除注释即可指定。
编辑:
看看这个SQLFiddle:
http://sqlfiddle.com/#!6/a1463/7
这实现了我上次评论的内容。
答案 1 :(得分:0)
这个答案主要是关于datediff()
的警告。
对于您的示例,datediff(day, @InputPeriodStart, @InputPeriodEnd)
返回11而不是12.这是因为datediff()
计算两个值之间月边界的数量。
我猜你想要12.你有两种方法可以得到这个:
DATEDIFF(month, @InputPeriodStart, @InputPeriodEnd)) + 1
或:
DATEDIFF(month, @InputPeriodStart, DATEADD(day, 1, @InputPeriodEnd))
或者,如果您不关心特定日期,您还可以对年和月值进行算术运算:
(1 + (YEAR(@InputPeriodEnd) * 12 + MONTH(@InputPeriodEnd)) -
(YEAR(@InputPeriodEnd) * 12 + MONTH(@InputPeriodStart))
)
DATEDIFF()
的语义可能有点令人困惑。定义很好(一般情况下)几秒钟和使用day
表示日期。在其他时候,它可能导致难以检测和解决的一个一个错误。