Как найти конечную дату на основе даты начала и продолжительности

#sql #sql-server-2008 #sql-server-2012

#sql #sql-server-2008 #sql-server-2012

Вопрос:

Я разработал онлайн-заявку на регистрацию в моей организации. В этом приложении у нас есть StartDate , Duration Duration Type столбцы вместе с некоторыми другими столбцами и нет EndDate столбца.

Теперь я сталкиваюсь с проблемой поиска конечной даты на основе StartDate amp; Duration .

Пожалуйста, помогите решить эту проблему.

Данные моей таблицы:

Данные таблицы прилагаются

Ожидаемый результат:

Ожидаемые данные прилагаются

Комментарии:

1. Так что же вас останавливает? Почему не то, что вы пробовали, не работает? Учитывая, что вы разработали базу данных, то получение конечной даты (просто добавление продолжительности) является довольно тривиальной задачей по сравнению с тем, что вы уже сделали.

2. Почему 2020-09-06 плюс 2 часа все еще 2020-09-06 , а не 2020-09-06T02:00:00 нет?

3. Кроме того, какая версия SQL Server? 2008 полностью не поддерживается в настоящее время, и уже более года.

4. @Larnu, в соответствии с требованиями приложения, мы не фиксируем конечную дату. Но при создании отчетов нам нужна КОНЕЧНАЯ дата для нашей аналитики. Как STARTDATE, так и ENDDATE определяются как столбцы ДАТЫ. Поэтому мне не нужно время.

Ответ №1:

Для достижения этой цели вам придется использовать CASE выражение. Из-за того, что месяц имеет переменную продолжительность, вы не можете преобразовать эти периоды в более общее значение (например, преобразовать периоды в минуты и добавить это). «1 месяц» с 01 февраля 2019 года составляет всего 28 дней, однако с 01 марта 2020 года это 31 день.

Это приводит к чему-то вроде этого:

 SELECT YT.StartDatY,
       CASE DurationType WHEN 'Minutes' THEN DATEADD(MINUTE,YT.Duration,UT.StartDate)
                         WHEN 'Hours' THEN DATEADD(HOUR,YT.Duration,UT.StartDate)
                         WHEN 'Days' THEN DATEADD(DAY,YT.Duration,UT.StartDate)
                         WHEN 'Months' THEN DATEADD(MONTH,YT.Duration,UT.StartDate)
                         WHEN 'Years' THEN DATEADD(Year,YT.Duration,UT.StartDate)
       END AS EndDate,
       YT.Duration,
       YT.DurationType
FROM dbo.YourTable YT;
  

Комментарии:

1. Я получаю сообщение об ошибке ниже. Сообщение 9810, уровень 16, состояние 1, строка 1 Дата-час не поддерживается функцией даты dateadd для типа данных date.

2. Я предположил , что вы используете тип данных даты и времени, а не date , @Rummy , поскольку вы хотите добавить часы к своему StartDate . Вам нужно преобразовать его в datetime / datetime2(0) в DATEADD . Вы не можете добавить часы к date , поскольку он не содержит временной части.

Ответ №2:

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

 DECLARE @table TABLE
(
    StartDate DATETIME,
    EenDate DATETIME  NULL,
    Duration INT,
    Type NVARCHAR(20)
)

INSERT INTO @table VALUES ('2020-08-18',NULL,15,'Days'),
('2020-08-18',NULL,10,'Month'),
('2020-08-18',NULL,10,'Hours'),
('2020-08-18',NULL,2,'Year')

SELECT * FROM @table

SELECT StartDate,CASE WHEN [Type] = 'Days' THEN CONVERT(DATE,DATEADD(DAY,Duration,StartDate))
WHEN [Type] = 'Month' THEN CONVERT(DATE,DATEADD(MONTH,Duration,StartDate))
WHEN [Type] = 'Hours' THEN CONVERT(DATE,DATEADD(HOUR,Duration,StartDate))
WHEN [Type] = 'Year' THEN CONVERT(DATE,DATEADD(YEAR,Duration,StartDate))
END EenDate,
Duration,Type FROM @table
  

Вывод

Вывод

Комментарии:

1. Спасибо за ваш запрос, и он работает только при вводе «Дней и месяцев». Это не работает, когда тип равен ‘часам’.

2. Да, мы можем добавить другой вариант, добавив, пожалуйста, проверьте обновленный ответ.

3. Большое Вам спасибо за вашу помощь!! Приведенный ниже запрос вернул точный ожидаемый результат. ВЫБЕРИТЕ StartDate, СЛУЧАЙ, КОГДА [Type] = ‘Days’ ЗАТЕМ ПРЕОБРАЗУЙТЕ (DATE, DATEADD(ДЕНЬ, продолжительность, дата начала)) КОГДА [Type] = ‘Months’ ЗАТЕМ ПРЕОБРАЗУЕТСЯ (DATE, DATEADD(МЕСЯЦ, продолжительность, дата начала)) КОГДА [Type] = ‘Hours’ ЗАТЕМ ПРЕОБРАЗУЙТЕ (DATE, DATEADD(HOUR, Duration, cast(приведите(StartDate как дату) как datetime))) КОГДА [Type] = ‘Year’ ЗАТЕМ ПРЕОБРАЗУЙТЕ (DATE, DATEADD(YEAR, Duration, StartDate)) КОНЕЧНУЮ дату окончания, продолжительность, тип ИЗ Testing1

Ответ №3:

Вы можете использовать функцию DATEADD, чтобы найти конечную дату.

 DATEADD (datepart , number , date ) 
  

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

Например, чтобы добавить один месяц к дате, вы можете сделать:

 SELECT DATEADD(month, 1, '20200915');
  

Ответ №4:

Приведенный ниже запрос вернул точный ожидаемый результат.

 SELECT StartDate,CASE WHEN [Type] = 'Days' THEN CONVERT(DATE,DATEADD(DAY,Duration,StartDate))
WHEN [Type] = 'Months' THEN CONVERT(DATE,DATEADD(MONTH,Duration,StartDate))
WHEN [Type] = 'Hours' THEN CONVERT(DATE,DATEADD(HOUR, Duration, cast(cast(StartDate as date) as datetime)))
WHEN [Type] = 'Year' THEN CONVERT(DATE,DATEADD(YEAR,Duration,StartDate))
END EndDate,
Duration,Type FROM Testing1