2014-01-08 3 views
1

У меня есть таблица tbltimetable, с тремя колоннами, Appdate, begintime, endtime (все datetime типа данных).Заменить столбец SQL значения

Образец данных:

Appdate     begintime     endtime 
2013-09-11 00:00:00.000 1900-01-01 12:30:00.000  1900-01-01 14:45:00.000 

Мне нужен конечный результат, как следующее: заменить дату в BeginTime и Конечное время от appdate.

Appdate     begintime     endtime 
2013-09-11 00:00:00.000 2013-09-11 12:30:00.000 2013-09-11 14:45:00.000 

Я попытался разделить дату и время из соответствующих столбцов, но теперь я ударил в добавлении/замене значения из appdate в BeginTime и Конечное время.

select convert(date,tbltimetable.AppDate) as [date], 
convert(varchar(8), convert(time, tblAppTime.AppDate)) as [Time] 
+0

что вы не пробовали до не пожалуйста добавьте этот запрос здесь –

+1

@James S, Он не может помочь, когда compan y решает использовать SQL 2008. –

ответ

0

Используйте функцию DATEPART для извлечения каждого компонента даты и времени. для примера:

DECLARE @datetime DATETIME 
SET @datetime = GETDATE() 
SELECT DATEPART(YEAR, @datetime), DATEPART(MONTH, @datetime), DATEPART(DAY, @datetime), DATEPART(HOUR, @datetime), DATEPART(MINUTE, @datetime), DATEPART(SECOND, @datetime), DATEPART(MILLISECOND, @datetime) 

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

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

CREATE FUNCTION dbo.GetDateOnly 
(
@Datetime DATETIME 
) 
RETURNS DATE 
AS BEGIN 

DECLARE @dateString VARCHAR(10), @temp VARCHAR(3) 
SET @dateString = CAST(DATEPART(YEAR, @Datetime) AS VARCHAR) 
SET @temp = CAST(DATEPART(MONTH, @Datetime) AS VARCHAR) 
SET @dateString = @dateString + '-' + REPLICATE('0', 2 - len(@temp)) + @temp 
SET @temp = CAST(DATEPART(DAY, @Datetime) AS VARCHAR) 
SET @dateString = @dateString + '-' + REPLICATE('0', 2 - len(@temp)) + @temp 
RETURN CONVERT(DATE, @dateString) 
END 
GO 

Пример кода, чтобы проверить эту новую функцию:

SELECT GETDATE() 
SELECT dbo.GetDateOnly(GETDATE()) 

Таким образом, вы можете написать функцию времени тоже!

+0

Я получаю способ извлечения каждой части, но моя проблема заключается в их добавлении – gs11111

+0

@ gs11111 Я предоставил новый FN для этой проблемы. Позвольте мне знать, если это помогает! –

0

TRY это ...

select a.Appdate, 
convert(datetime,(convert(varchar(10),convert(date,a.Appdate))+' ' + convert(varchar(10),convert(time,a.begintime)))) begintime, 
convert(datetime,(convert(varchar(10),convert(date,a.Appdate))+' ' + convert(varchar(10),convert(time,a.endtime)))) endtime 
from tblTimetable a 
1
DECLARE @t table (
    appdate datetime 
, begintime datetime 
, endtime datetime 
); 

INSERT INTO @t (appdate, begintime, endtime) 
    VALUES ('2013-09-11 00:00:00.000', '1900-01-01 12:30:00.000', '1900-01-01 14:45:00.000') 
; 

SELECT appdate 
    , begintime 
    , DateAdd(mi, begintime_mi, DateAdd(hh, begintime_hh, appdate)) As new_begintime 
    , endtime 
    , DateAdd(mi, endtime_mi, DateAdd(hh, endtime_hh, appdate)) As new_endtime 
FROM (
     SELECT appdate 
      , begintime 
      , DatePart(hh, begintime) As begintime_hh 
      , DatePart(mi, begintime) As begintime_mi 
      , endtime 
      , DatePart(hh, endtime) As endtime_hh 
      , DatePart(mi, endtime) As endtime_mi 
     FROM @t 
     ) As finding_time_portions 
; 

Это захватывает части время от begintime и endtime с помощью функции DatePart(), а затем добавляет их к исходному appdate с помощью функции DateAdd() ,

2

Я просто использовать шаблон DATEADD/DATEDIFF дважды:

declare @t table (Appdate datetime,begintime datetime,endtime datetime) 
insert into @t(Appdate,begintime,endtime) values 
('2013-09-11T00:00:00.000','1900-01-01T12:30:00.000','1900-01-01T14:45:00.000') 

select Appdate, 
    DATEADD(day,DATEDIFF(day,begintime,AppDate),beginTime) as AdjustedBegin, 
    DATEADD(day,DATEDIFF(day,endtime,AppDate),endtime) as AdjustedEnd 
from @t 

Это позволяет избежать отводом о с расщеплением из отдельных компонентов или преобразования в/из строк.

Внутренний DATEDIFF(day,begintime,AppDate) просто вычисляет число полуночных переходов между begintime и AppDate - это не обращает внимания на временные компоненты либо, и возвращает целое число. Если мы добавим (DATEADD) количество дней на begintime, мы логически получим значение datetime с той же даты, что и AppDate, но с его компонентами времени не изменилось с begintime.

+0

+1 - намного проще, чем мой! – gvee

0

Просто добавьте эти значения :) Вы можете наложить временную часть на тип данных TIME, но она работает без кастинга.

1

это не так просто, как это

DECLARE @t TABLE(Appdate DATETIME,begintime DATETIME,endtime DATETIME) 
INSERT INTO @t 
VALUES 
('2013-09-11 00:00:00.000','1900-01-01 12:30:00.000','1900-01-01 14:45:00.000') 

SELECT * FROM @t 

╔═════════════════════════╦═════════════════════════╦═════════════════════════╗ 
║   Appdate   ║  begintime  ║   endtime   ║ 
╠═════════════════════════╬═════════════════════════╬═════════════════════════╣ 
║ 2013-09-11 00:00:00.000 ║ 1900-01-01 12:30:00.000 ║ 1900-01-01 14:45:00.000 ║ 
╚═════════════════════════╩═════════════════════════╩═════════════════════════╝ 

Query

SELECT Appdate 
     , begintime + Appdate AS begintime 
     , endtime + Appdate AS endtime 
FROM @t 

Результат Набор

╔═════════════════════════╦═════════════════════════╦═════════════════════════╗ 
║   Appdate   ║  begintime  ║   endtime   ║ 
╠═════════════════════════╬═════════════════════════╬═════════════════════════╣ 
║ 2013-09-11 00:00:00.000 ║ 2013-09-11 12:30:00.000 ║ 2013-09-11 14:45:00.000 ║ 
╚═════════════════════════╩═════════════════════════╩═════════════════════════╝ 
Смежные вопросы