2016-07-17 3 views
1

У меня есть оператор SQL, который сравнивает только время в столбце Datetime. Если критерии выполнены, мне нужен столбец, чтобы обновить и связать значение времени с соответствующей датой в этой строке.Объединить значение времени для соответствия строке Дата SQL Server

Вот SQL заявление,

declare @first datetime 
set @first = '2016/10/10 06:47:16.123' 
declare @second datetime 
set @second = '2016/10/10 10:47:16.123' 
declare @myTime datetime 
set @myTime = '2016/10/10 00:15:16.123' 


UPDATE Staff_Manager.dbo.Staff_Time_TBL   
     SET Time_Data_1 = CASE 
      WHEN CAST(Time_Data_1 AS time) 
      BETWEEN CAST(@first AS time) AND CAST(@second AS time) 
      THEN CAST(Date_Data AS date) + CAST(@myTime AS time)       
     ELSE NULL  
     END 
    WHERE Staff_No = 1903 AND Date_Data BETWEEN '2016/2/1' AND '2016/3/1' 

После того, как критерии встретились мне нужна эта строка ниже, чтобы получить дату из этой строки из столбца с именем Date_Data (тип данных DATE) и сцепить его с только значение времени в столбец с именем (тип данных DATETIME)

THEN CAST(Date_Data AS date) + CAST(@myTime AS time) 

в настоящее время я получаю сообщение об ошибке,

Дата добавления даты недействительна для оператора добавления.

Я считаю, что это можно было сделать до 2008 года, но я на SQL-сервере 2014, как вы собираетесь делать что-то подобное.

+0

вам нужно еще один бросок, чтобы добавить время произнесения (CAST (Date_Data как дата), как DateTime) + бросание (CAST (@myTime AS время) как DateTime) – nazark

+0

@nazark, спасибо, что зафиксировал его. Работаю сейчас. – KyloRen

+0

@nazark, да, я буду голосовать и отмечать как ответ. Спасибо за помощь. – KyloRen

ответ

1

Тип должен быть тем же самым, добавляя время, попробуйте

cast(cast(Date_Data as date) as datetime) + cast(CAST(@myTime AS time) as datetime) 
0

Ну, дата - тип данных даты, а время - это тип данных времени. Вы смотрите на строку этих значений, которая похожа на тип данных datetime, но они являются яблоки и апельсины для SQL Server.

Но если вы нормализуете их обоих в то, что вы видите (а VARCHAR строка), вы можете преобразовать эту строку в DateTime:

select convert(datetime, convert(varchar(10), @date) + ' ' + convert(varchar(12), @time)) 
+0

Я намерен ответить на этот вопрос, поскольку у меня он работает наполовину, но он вызывает некоторые странные результаты. это то, что я сделал, 'Date_Data' - это столбец,' convert (datetime, convert (varchar (10), Date_Data) + '' + convert (varchar (12), @myTime)) ' – KyloRen

1

В SQL Server 2012 вы можете сделать это:

DATETIMEFROMPARTS ( 
    datepart(YEAR, Date_Data), 
    datepart(MONTH, Date_Data), 
    datepart(DAY, Date_Data), 
    datepart(HOUR, @myTime), 
    datepart(MINUTE, @myTime), 
    datepart(SECOND, @myTime), 
    datepart(MILLISECOND, @myTime) 
    ) 

На передней версии вы можете использовать это удовольствие фикция тоже:

CREATE FUNCTION [dbo].[DATETIME2FROMPARTS](
    @year int, 
    @month int, 
    @day int, 
    @hour int, 
    @minute int, 
    @second int, 
    @fractions int, 
    @precision int) 
    RETURNS datetime2(7) 
    AS 
    BEGIN 
    RETURN 
    DATEADD(NANOSECOND, POWER(10, [email protected])*@fractions, 
    DATEADD(SECOND, @second, 
    DATEADD(MINUTE, @minute, 
    DATEADD(HOUR, @hour, 
    DATEADD(DAY, @day-1, 
    DATEADD(MONTH, @month-1, 
    DATEADD(YEAR, @year-1900, 
    CAST(CAST(0 AS datetime) AS datetime2(7))))))))); 
    END