【问题标题】:How to get date difference between two dates in same year with one date is from an input date not from the year如何使用一个日期获取同一年两个日期之间的日期差异来自输入日期而不是年份
【发布时间】:2011-08-22 11:07:39
【问题描述】:

这就是我的情况:我有一个输入日期 X (dd-mm-yyyy),我想计算它之间的天数,并将年份部分更改为 SQL 中的当前年份和今天的日期。在临时更改年份后,它带有以下条件:(这是我目前的逻辑想法) - 如果日期 X 早于今天,则差异 = datediff(X,now),其中 X 年是当前年份 - 如果日期 X 晚于今天,则差异 = datediff(X,now),其中 X 年是前一年

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

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

对不起,如果已经有类似的问题,我只是不知道这个问题的确切关键字:(如果以前有这样的问题,请随时指导我。

提前致谢

【问题讨论】:

    标签: sql sql-server date


    【解决方案1】:

    这是实现(如果我正确理解了您需要的逻辑):

    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*/
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 我决定使用它,因为我避免使用任何存储过程/功能,但我仍然感谢 Andrei 提供的方式:D 感谢 Andriy M 和 Andrei,您的解决方案完全有效:D
      【解决方案3】:

      这似乎可以完成这项工作

          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() 代替今天日期的字符串

      【讨论】:

        【解决方案4】:

        我在 SQL Server 2005 上的代码中使用了 "SELECT DATEDIFF(D, "+myDate+", GETDATE())"。它适用于我。 myDate 的值当然是 DateTime 输入值。

        【讨论】:

          【解决方案5】:

          你应该试试这个查询:

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-07
            • 1970-01-01
            • 2022-10-02
            • 1970-01-01
            • 2022-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多