如何在同一年的两个日期之间获得一个日期的日期差异来自输入日期而不是年份

时间:2011-08-22 11:07:39

标签: sql sql-server date

这就是我的情况:我有一个输入日期X(dd-mm-yyyy),我想计算它与年份部分更改为当前年份和今天的SQL日期之间的天数。在临时更改年份后,我会遇到以下情况:(这是我目前对逻辑的看法) - 如果日期X早于今天,那么差异= datediff(X,现在),X年是当前年份 - 如果日期X晚于今天,那么差异= datediff(X,现在),X年是一年之前

示例案例: 第一种情况:输入日期为6-6-1990。今天(自动生成)是22-8-2011。然后差异将是= datediff(6-6-2011,22-08-2011) 第二种情况:输入日期为10-10-1990。今天(自动生成)是22-8-2011。然后差异将是= datediff(10-10-2010,22-08-2011)

知道如何在SQL中执行此操作(在SQL Server中)?或者还有其他更简单的替代方案可以解决这个问题吗?我也希望在查询中完成此操作而不使用存储过程或函数

很抱歉,如果已经有类似的问题,我只是不知道这个问题的确切关键字:(如果之前有这样的问题,请随时指示我。

提前致谢

5 个答案:

答案 0 :(得分:3)

这是实现(如果我理解你需要的逻辑):

USE YourDbName
GO

CREATE FUNCTION YearPartDiff (@date datetime)
RETURNS int
AS
BEGIN
    DECLARE @dateCurrentYear datetime
    SET @dateCurrentYear = DATEADD(year, YEAR(GETDATE()) - YEAR(@date), @date)

    DECLARE @result int

    IF @dateCurrentYear < GETDATE()
        SET @result = ABS(DATEDIFF(day, @dateCurrentYear, GETDATE()))
    ELSE
        SET @result = ABS(DATEDIFF(day, DATEADD(year, -1, @dateCurrentYear), GETDATE()))

    RETURN(@result)
END
GO

使用示例:

USE YourDbName
GO

DECLARE @someDate datetime
SET @someDate = '2011-06-06'

SELECT dbo.YearPartDiff(@someDate) /*returns 77*/

SET @someDate = '2010-10-10'

SELECT dbo.YearPartDiff(@someDate) /*returns 316*/

答案 1 :(得分:2)

基本上,@Andrei的解决方案,但在一个声明中:

SELECT
  DayDiff = DATEDIFF(
    DAY,
    DATEADD(YEAR, CASE WHEN LastOcc > GETDATE() THEN -1 ELSE 0 END, LastOcc),
    GETDATE()
  )
FROM (
  SELECT LastOcc = DATEADD(YEAR, YEAR(GETDATE()) - YEAR(@InputDate), @InputDate)
) s

答案 2 :(得分:1)

这似乎可以完成这项工作

    SELECT DATEDIFF(DAY, CONVERT(DATETIME, N'2011-06-06'), CONVERT(DATETIME, N'2011-08-22'))

所以基本语法是

    SELECT DATEDIFF(DAY, CONVERT(DATETIME, N'yyyy-mm-dd'), CONVERT(DATETIME, N'yyyy-mm-dd '))

或者,您可以使用GETDATE()代替今天日期的字符串

答案 3 :(得分:0)

我在SQL Server 2005的代码中使用了“SELECT DATEDIFF(D,”+ myDate +“,GETDATE())”。它对我有用。值myDate当然是DateTime输入值。

答案 4 :(得分:0)

你应该尝试这个查询:

create table #T (inp_date datetime)

insert #T values ('06-06-1990')
insert #T values ('08-22-1990')
insert #T values ('10-10-1990')

--select * from #T

select inp_date, GETDATE(),
    CASE
        WHEN DATEADD(yy,DATEDIFF(yy,inp_date,GETDATE()),inp_date) <= GETDATE()
            THEN DATEDIFF(dd,DATEADD(yy,DATEDIFF(yy,inp_date,GETDATE()),inp_date),GETDATE())
        ELSE DATEDIFF(dd,DATEADD(yy,DATEDIFF(yy,inp_date,GETDATE())-1,inp_date),GETDATE())
    END
from #T