#sql #stored-procedures #sqldatatypes
#sql #хранимые процедуры #sqldatatypes
Вопрос:
Я пытаюсь установить некоторые переменные и создать процедуру, которая будет создавать таблицы разных типов в каждом случае инструкции. Условия зависят от типов данных даты, и я получаю сообщение об ошибке:
Сообщение 402, уровень 16, состояние 1, процедура epSP, строка 50 [Строка запуска пакета 0] Типы данных time и datetime несовместимы в операторе больше или равно.
Код, который я добавил, — это не весь код. Это часть более длинной инструкции с инструкцией IF . Я попытался добавить типы данных даты перед различными частями процедур и изменить дату после оператора < на оператор select .
CREATE PROCEDURE epSP
@StartDate DATETIME,
@EndDate DATETIME,
@CompanyID INT
AS
SET @StartDate = '2019-04-04 00:00:00'
SET @EndDate = '2019-04-11 00:00:00'
SET @CompanyID = 1234567
BEGIN
(CAST(GETDATE() AS DATETIME) < @StartDate)
(
SELECT sa.CompanyID,
sa.EmployeeID,
sm.Day,
sa.Date,
sm.ShiftType,
sm.StartTime,
sm.EndTime
FROM ShiftArrangement sa
LEFT JOIN ShiftManagement sm
ON (sa.SHIFTID = sm.ShiftID)
WHERE sa.CompanyID = @CompanyID
AND sa.Date BETWEEN @StartDate AND @EndDate
)
Ожидаемым результатом является оператор SELECT в соответствии с датой, указанной в переменной, определенной в начале инструкции. На самом деле код не возвращает никакого значения.
Комментарии:
1. так что это должно выглядеть
IF (GETDATE() < @StartDate) BEGIN ... END
правильно?2. Похоже, что столбец даты таблиц «ShiftArrangement» определяется как тип данных «Time». Но вы сравниваете тип данных «Time» с типом данных datetime (оператор between). Вы можете получить более подробную информацию о типах данных здесь: learn.microsoft.com/en-us/sql/t-sql/functions /…
3. Вам не нужно приводить
GETDATE()
какDATETIME
. Функция уже возвращаетDATETIME
тип данных.4. Можете ли вы предоставить пример схемы и данных, которые отражают ваши таблицы выше? Кроме того, с какой версией SQL Server вы работаете?
5. Вероятно, вам следует изменить имя
ShiftArrangement.Date
иShiftManagement.Day
на слова, которые не являются специальными словами в SQL и более описывают, что они собой представляют. Я не уверен, чтоDay
это такое, ноDate
, похоже, этоTIME
тип данных, который вряд ли совместим с тем, что должен содержать этот столбец. Даже если вам удастся преобразоватьsa.Date
в формат с датой, а не только временем, он также, вероятно, не попадет между ними@StartDate
или@EndDate
это не произошло 1/1/1900. Нам нужны некоторые примеры данных и ожидания вывода, чтобы помочь.