Как исправить несовместимость типов данных time и datetime в SQL Server

#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. Нам нужны некоторые примеры данных и ожидания вывода, чтобы помочь.