#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