首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL Server中使用DATEDIFF的最准确方法是什么?

在SQL Server中使用DATEDIFF的最准确方法是什么?
EN

Stack Overflow用户
提问于 2013-04-08 18:47:35
回答 3查看 17.5K关注 0票数 4

我有两个计算列(MonthsInService和YearsInService),它们具有以下表达式。

MonthsInService = (datediff(month,[DateEngaged],getdate()))

YearsInService = (datediff(month,[DateEngaged],getdate())/(12))

现在,如果DateEngaged =2012-4月-09,getdate()为2013-4月-08,则MonthsInService返回12,YearsInService为1。

我的应用程序要求YearsInService为零,因为距离员工一周年纪念日还有一天。

我甚至不确定如何最好地处理MonthsInService列,因为月份有不同的天数。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-08 18:59:41

通过使用day,您可以得到以下结果:

代码语言:javascript
复制
select 
datediff(month,'2012-April-09','2013-April-08') MonthsInService
,datediff(day,'2012-April-09','2013-April-08')/365 YearsInService

输出

代码语言:javascript
复制
12  0  

或使用函数以获得最大精度:

代码语言:javascript
复制
CREATE FUNCTION [dbo].[getFullYears] 
(
    @dateX datetime,
    @dateY datetime
)  
RETURNS int
AS  
BEGIN 
    DECLARE @y int
    SET @y =DATEDIFF(year,@dateX,@dateY)
    IF (@dateY < DATEADD(year, @y, @dateX)) SET @y = @y -1
    RETURN @y
END

select dbo.getFullYears('2012-April-09','2013-April-09') --1
select dbo.getFullYears('2012-April-09','2013-April-08') --0

对于月份计算,您可以参考此处:Calculating number of full months between two dates in SQL

票数 1
EN

Stack Overflow用户

发布于 2013-04-08 21:39:13

不幸的是,DATEDIFF计算元素的转换次数,而不是通常的人类对两个日期之间差异的直觉(例如,DATEDIFF(year,'20121231','20130101')是1,尽管没有多少人会说有一年的差异)。

我使用的解决方案有点重复,但不需要单独的函数,并且总是正确的,例如闰年:

代码语言:javascript
复制
declare @T table (
    DateEngaged datetime not null,
    MonthsInService as CASE
        WHEN DATEADD(month,DATEDIFF(month,DateEngaged,GETDATE()),DateEngaged) > GETDATE()
            THEN DATEDIFF(month,DateEngaged,GETDATE()) - 1
            ELSE DATEDIFF(month,DateEngaged,GETDATE())
        END,
    YearsInService as CASE
        WHEN DATEADD(year,DATEDIFF(year,DateEngaged,GETDATE()),DateEngaged) > GETDATE()
            THEN DATEDIFF(year,DateEngaged,GETDATE()) - 1
            ELSE DATEDIFF(year,DateEngaged,GETDATE())
        END
)

insert into @T (DateEngaged) values ('20120409'),('20120408')

select * from @T

产生:

代码语言:javascript
复制
DateEngaged             MonthsInService YearsInService
----------------------- --------------- --------------
2012-04-09 00:00:00.000 11              0
2012-04-08 00:00:00.000 12              1

它的工作原理是问“如果我们采用DATEDIFF产生的天真的答案,它给出的答案是不是太高了1?”-如果是的话,我们只需从它给出的答案中减去1。DATEDIFF应该只在% 1之前结束。

票数 5
EN

Stack Overflow用户

发布于 2021-10-25 18:30:06

尝试此查询:

代码语言:javascript
复制
DATEDIFF(DAY, CONVERT(date, dtmDOB),                         
  CONVERT(date, GETDATE()))*(12.0/365.25)),1))                      
  AS TotalMonths,         
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15877194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档