2015-01-22 3 views
2

У меня есть Crea_Date столбец, который является DateTime Колонка. Я хочу вычесть значение в столбце IST из столбца crea_date и вернуть новый столбец с значением DateTime. Моя выборка данных, как это:Как вычесть время столбца из столбца DateTime в SQL?

States crea_date    IST 
AB  2014-12-30 15:01:00.000 12:30:00.0000000 
AK  2014-12-29 16:32:00.000 10:30:00.0000000 
AZ  2014-12-18 16:07:00.000 11:30:00.0000000 

Заранее спасибо

+1

В каких СУБД вы используете SQL-сервер, MySQL, Oracle и т. Д.? Является ли IST столбцом datetime? – SouravA

+0

@Sourav_Agasti, я использую SQL-Server. – TheDProgrammer

ответ

0

Если IST представляет собой целое число секунд:

SELECT DATEADD(s, -IST, crea_date) 
FROM yourTable 

Если IST имеет тип TIME:

SELECT DATEADD(ms, DATEDIFF(ms, IST, '00:00:00'), crea_date) 
FROM yourTable 
+0

При попытке вашего метода я получаю сообщение об ошибке: 'Msg 8117, уровень 16, состояние 1, строка 2 Неверное значение типа данных операндов для оператора минус.' – TheDProgrammer

+0

Отредактировал мой ответ, добавив случай типа «TIME». В первой версии вашего вопроса не было ясно. – 0xF

+0

Ваш ответ служит моей цели. Еще одна МАЛЕНЬКАЯ СЛУЧАЯ! Как получить данные в новом столбце как '2014-12-31 03:31 PM'? – TheDProgrammer

0

Попробуйте ниже, если IST - это символ, основанный на col итп.

SELECT 
Crea_Date, IST, 
dateadd(hh,cast(substring(IST,1,2) as int), 
    dateadd(mi, cast(substring(IST, 4,2) as int), 
      dateadd(s, cast(substring(IST,7,2) as int), crea_date) 
      )) Final_Date 
from [Yourtable] 

Вы получите дополнительную дату в Final_Date колонке.

+0

Прошу прощения, я забыл упомянуть колонку «IST» - колонку «Время» с данными в формате «12: 30: 00.0000000» ... спасибо – TheDProgrammer

0

С небольшими изменениями в @ 0xf Ответ Я нашел окончательное решение:

convert(varchar(10), 
DATEADD(ms, DATEDIFF(ms, '00:00:00', IST), crea_date), 101) + right(convert(varchar(32 
DATEADD(ms, DATEDIFF(ms, '00:00:00', IST), crea_date),100),8) 
+0

Swap '00: 00: 00 'с IST, если вы хотите время _subtracted_ из 'crea_date'. – 0xF

+0

Пожалуйста, не добавляйте «спасибо» в качестве ответов. Потратьте некоторое время на сайт, и вы получите достаточные [привилегии] (http://stackoverflow.com/privileges), чтобы вы могли найти ответы, которые вам нравятся, а это способ переполнения стека сказать спасибо. –

2

Как ни странно это может показаться, вы можете добавить/вычесть datetime значения, и это, кажется, что это «нормальное» поведение.

Внутреннее значение datetime хранится как смещение от 1/1/1900. Если я добавлю 22/1/2015 и 1/1/2015, я получаю 22/1/2130, потому что второе значение на самом деле 115 лет после 1900.

При присвоении значения time значение datetime копируется только компонент времени, а для компонента даты установлено значение 1/1/1900. По сути, у вас есть интервал, равный вашему первоначальному значению времени.

Таким образом, я могу вычесть 10:30 часов от конкретной даты-времени:

declare @d datetime='2014-11-04 12:51:00', @t time='10:30:00' 
select @d -cast(@t as datetime) 

//----------------------- 
//2014-11-04 02:21:00.000 

Такое поведение не является причудой реализация - это явно разрешено только для datetime типа. Все остальные типы данных (например, datetime2, datetimeoffset) возвращают ошибку Operand data type datetimeoffset is invalid for subtract operator.

+0

Действительно, 'SELECT crea_date - cast (IST as datetime) FROM yourTable' является более элегантным, чем мое решение. – 0xF

+0

И совершенно неожиданно. ** ЕСЛИ ТОЛЬКО ** SQL Server имел правильную поддержку интервалов! –

+0

Я всегда хранил интервалы как простое число «INT» секунд. Только теперь я узнал, что SQL Server 2008 ввел тип 'TIME'. – 0xF

Смежные вопросы