한 필드의 날짜와 다른 필드의 시간을 결합하는 방법-MS SQL Server


198

내가 다루고있는 추출에는 2 개의 datetime열이 있습니다. 한 열은 날짜와 시간을 저장합니다.

이 두 필드를 유형 1 열로 결합하기 위해 테이블을 쿼리하는 방법은 datetime무엇입니까?

날짜

2009-03-12 00:00:00.000
2009-03-26 00:00:00.000
2009-03-26 00:00:00.000

타임스

1899-12-30 12:30:00.000
1899-12-30 10:00:00.000
1899-12-30 10:00:00.000

답변:


252

두 개만 추가하면됩니다.

  • 경우Time part 당신의 Date열은 항상 0이다
  • Date part 당신의 Time열은 항상 0입니다 (기본 날짜 : 1900 년 1 월 1 일)

그것들을 추가하면 올바른 결과를 반환합니다.

SELECT Combined = MyDate + MyTime FROM MyTable

이론적 근거 (EricE / dnolan에 대한 제안)

날짜가 2 개의 4 바이트 Integers로 저장되는 방식으로 인해 왼쪽 4 바이트는 date이고 오른쪽 4 바이트는 time입니다. 그 것처럼$0001 0000 + $0000 0001 = $0001 0001

새로운 SQL Server 2008 유형 관련 편집

DateTime소개 된 유형입니다 SQL Server 2008. 추가를 주장하면 사용할 수 있습니다.Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)

SQL Server 2008 이상의 정밀도 손실에 관한 Edit2 (Martin Smith에게 추천)

SQL Server에서 날짜와 시간을 datetime2로 결합하는 방법을 살펴보십시오 . SQL Server 2008 이상을 사용하여 정밀도 손실을 방지합니다.


2
@Jon, 날짜 열의 시간 요소와 시간 열의 날짜 요소가 모두 0 인 한 사실입니다.
LukeH

1
당신은 대부분 여기 desribed 무엇 발생하는 groups.google.be/group/... 볼랜드 * + 저자 %의 3A teamb * # 1ab62659d8be3135
리벤 Keersmaekers

2
SQL Server의 "제로"날짜는 1900-01-01입니까?
Andriy M

1
내가 이것을 시도했을 때 'time'값을 datetime으로 캐스팅 할 필요가 없었습니다. 즉, 날짜 / 시간
Sam

1
SQL Server의 @dnolan 날짜는로 저장되지 않습니다 float. 지구 어디에서 이것을 배웠습니까? 이들은 저장되는 정수 : 날짜 부가 앵커 일 이후 일 수 있으며, 시간 부분 자정 이후 "틱"의 수이다 대해 1/300들로 정의되는 틱 datetime과 더 정밀 time하고 datetime2.
ErikE

129

날짜 열의 시간 요소 시간 열의 날짜 요소가 모두 0이면 Lieven의 답변 이 필요합니다. 항상 그런 경우를 보장 할 수 없다면 약간 더 복잡해집니다.

SELECT DATEADD(day, 0, DATEDIFF(day, 0, your_date_column)) +
    DATEADD(day, 0 - DATEDIFF(day, 0, your_time_column), your_time_column)
FROM your_table

답변 Luke에게 감사합니다. 운 좋게도이 경우 다른 항목이 항상 0임을 보장 할 수 있습니다. 2 필드는 다른 쪽에서도 1 일 수 있습니다.
Jon Winstanley

6
불필요한 부분이 0이 아니라는 것을 제외하고는 OP와 동일한 문제가있었습니다. 따라서 내가 두 번 투표 할 수 있다면 이것은 매우 유용했습니다!

이것은 나를 구했다! 두 문자를 모두 문자로 변환 한 다음 연결하고 DATETIME으로 돌아 갔지만 SQL이 비 결정적이라고 말했기 때문에 색인을 생성 할 수 없었습니다. 이것은 분명히 결정적입니다! 감사합니다 !!! 당신 !!!
eidylon

4
SQL Server 2008 버전이 작동하지 않습니다. The data types datetime and time are incompatible in the add operator.
Martin Smith

@ Martin : 깨진 SQL2008 버전을 제거했습니다.
LukeH

26

이것은 char 변환이없는 대안 솔루션입니다.

DATEADD(ms, DATEDIFF(ms, '00:00:00', [Time]), CONVERT(DATETIME, [Date]))

이 방법으로 밀리 초 정확도 만 얻을 수 있지만 일반적으로 괜찮습니다. SQL Server 2008에서 이것을 테스트했습니다.


14

이것은 나를 위해 일했다

CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME)

(SQL 2008 R2에서)


1
Tobias

7
데이터 유형 날짜 시간과 시간이 add 연산자에서 호환되지 않습니다. SQL Server 2012의 오류
Devin Prejean

4
SQL 2012 데이터 유형 날짜 / 시간이 추가 연산자에서 호환되지 않습니다
Raffaeu

3
더 이상 SQL Server 2012 이상에서 작동하지 않습니다 (변경 사항 변경). 자세한 내용은 여기를 참조하십시오 : social.msdn.microsoft.com/forums/azure/en-US/…
Heinzi

10

SQL Server 2008을 사용하지 않는 경우 (예 : DateTime 데이터 형식 만있는 경우) 다음 TSQL을 사용하여 원하는 것을 얻을 수 있습니다.

DECLARE @DateOnly AS datetime
DECLARE @TimeOnly AS datetime 

SET @DateOnly = '07 aug 2009 00:00:00'
SET @TimeOnly = '01 jan 1899 10:11:23'


-- Gives Date Only.
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly))

-- Gives Time Only.
SELECT DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)

-- Concatenates Date and Time parts.
SELECT
CAST(
    DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly)) + ' ' +
    DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)           
as datetime)

거칠고 준비되었지만 작동합니다!


9
  1. 두 필드가 모두 날짜 시간 인 경우 간단히 추가하면됩니다.

    예 :

    Declare @d datetime, @t datetime
    set @d = '2009-03-12 00:00:00.000';
    set @t = '1899-12-30 12:30:00.000';
    select @d + @t
  2. 날짜 및 시간 데이터 유형을 사용한 경우 시간을 날짜 시간으로 캐스트하십시오.

    예 :

    Declare @d date, @t time
    set @d = '2009-03-12';
    set @t = '12:30:00.000';
    select @d + cast(@t as datetime)

3

날짜 시간 필드에 저장된 첫 번째 날짜를 문자열로 변환 한 다음 날짜 시간 필드에 저장된 시간을 문자열로 변환하고 두 날짜를 추가 한 후 알려진 변환 형식을 사용하여 날짜 시간 필드로 다시 변환하십시오.

Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103) 

3
문자열로 변환하는 것이 dateadd보다 느립니다. stackoverflow.com/questions/2775/…
ErikE

2

위에서 언급 한대로 많은 오류가 있었으므로 이렇게했습니다.

try_parse(concat(convert(date,Arrival_date),' ',arrival_time) as datetime) AS ArrivalDateTime

그것은 나를 위해 일했다.


2

두 필드를 모두 DATETIME으로 변환하십시오.

SELECT CAST(@DateField as DATETIME) + CAST(@TimeField AS DATETIME)

그리고 Getdate()이것을 사용한다면 이것을 먼저 사용하십시오 :

DECLARE @FechaActual DATETIME = CONVERT(DATE, GETDATE());
SELECT CAST(@FechaActual as DATETIME) + CAST(@HoraInicioTurno AS DATETIME)

1
DECLARE @Dates table ([Date] datetime);
DECLARE @Times table ([Time] datetime);

INSERT INTO @Dates VALUES('2009-03-12 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-26 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-30 00:00:00.000');

INSERT INTO @Times VALUES('1899-12-30 12:30:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');

WITH Dates (ID, [Date])
AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [Date]), [Date] FROM @Dates
), Times (ID, [Time])
AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [Time]), [Time] FROM @Times
)
SELECT Dates.[Date] + Times.[Time] FROM Dates
    JOIN Times ON Times.ID = Dates.ID

인쇄물:

2009-03-12 10:00:00.000
2009-03-26 10:00:00.000
2009-03-30 12:30:00.000


0

CAST (CAST (날짜로 날짜 필드)를 DateTime으로) + CAST (CAST (@TimeField 시간으로)를 DateTime으로)


0

또 다른 방법은 사용하는 것입니다 CONCAT그리고 CAST당신이 사용해야하는 것을 알고, DATETIME2(x)그것을 작동하게 할 수 있습니다. 정밀도 손실이 없음 x0-7 7의미하는 값 으로 설정할 수 있습니다 .

DECLARE @date date = '2018-03-12'
DECLARE @time time = '07:00:00.0000000'
SELECT CAST(CONCAT(@date, ' ', @time) AS DATETIME2(7))

보고 2018-03-12 07:00:00.0000000

SQL Server 14에서 테스트


-1

날짜 시간 열의 날짜와 다른 날짜 시간 열의 시간을 결합하려면 이것이 가장 빠른 솔루션입니다.

select cast(cast(DateColumn as date) as datetime) + cast(TimeColumn as datetime) from YourTable

"날짜 및 시간 데이터 유형이 추가 연산자에서 호환되지 않습니다."오류가 발생합니다.
Oskar Berggren 1

-1

날짜 및 시간 필드를 DateTime 필드와 병합 해야하는 비슷한 상황이 발생했습니다. 위에서 언급 한 해결책 중 어느 것도 작동하지 않으며, 특히이 두 필드를 추가하기위한 데이터 유형으로 두 필드를 추가하는 것은 동일하지 않습니다.

아래 솔루션을 만들어서 날짜에 시간과 분을 추가했습니다. 이것은 나를 위해 아름답게 작동했습니다. 확인 후 문제가 발생하면 알려주십시오.

; tbl을 (StatusTime = '12 / 30 / 1899 5:17:00 PM ', StatusDate ='7/24/2019 12:00:00 AM '으로 선택) DATEADD (MI, DATEPART (MINUTE, CAST (tbl .StatusTime AS TIME)), DATEADD (HH, DATEPART (HOUR, CAST (tbl.StatusTime AS TIME)), CAST (tbl.StatusDate as DATETIME))) tbl에서

결과 : 2019-07-24 17 : 17 : 00.000

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.