Как получить разницу дат между двумя датами в одном и том же году с одной датой из даты ввода, а не из года - PullRequest
2 голосов
/ 22 августа 2011

Ну, это мой случай: у меня есть дата ввода X (дд-мм-гггг), и я хочу подсчитать количество дней между ней, когда часть года заменяется текущим годом и сегодняшней датой в SQL.I t приходит со следующим условием после временного изменения года: (Вот мое текущее представление о логике) - Если дата X раньше, чем сегодня, тогда разница = datediff (X, сейчас), с X годом является текущий год- Если дата X более поздняя, ​​чем сегодня, тогда разница = datediff (X, сейчас), причем год X равен на один год раньше

Пример выборки: 1-й случай: Дата ввода 6-6-1990.Сегодня (автоматически генерируется) 22-8-2011.Тогда разница будет = datediff (6-6-2011,22-08-2011) 2-й случай: Дата ввода 10-10-1990.Сегодня (автоматически генерируется) 22-8-2011.Тогда разница будет = datediff (10-10-2010,22-08-2011)

Есть идеи, как это сделать в SQL (в SQL Server)?Или есть другие более простые альтернативы для этой проблемы?Я также хотел бы, чтобы это было сделано в запросе и не использовал хранимую процедуру или функцию

Извините, если уже есть подобный вопрос, я просто не знаю точное ключевое слово для этой проблемы :( если естьвопрос как этот ранее, не стесняйтесь направить меня туда.

Заранее спасибо

Ответы [ 5 ]

3 голосов
/ 22 августа 2011

Вот реализация (если я правильно понял логику, которая вам нужна):

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 голосов
/ 22 августа 2011

В основном решение @ Андрей , но в одном утверждении:

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
1 голос
/ 22 августа 2011

Это похоже на работу

    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 () вместо строки для сегодняшней даты

0 голосов
/ 22 августа 2011

Вы должны попробовать этот запрос:

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
0 голосов
/ 22 августа 2011

Я использовал «SELECT DATEDIFF (D,« + myDate + », GETDATE ())» в моем коде на SQL Server 2005. Он работает для меня.Конечно, значение myDate будет входным значением DateTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...