Programing

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

lottogame 2020. 5. 15. 07:58
반응형

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


내가 다루고있는 추출에는 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

두 개만 추가하면됩니다.

  • 경우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 이상을 사용하여 정밀도 손실을 방지합니다.


날짜 열의 시간 요소 시간 열의 날짜 요소가 모두 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

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

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

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


이것은 나를 위해 일했다

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

(SQL 2008 R2에서)


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)

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


  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)
    

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

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

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

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

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

그것은 나를 위해 일했다.


두 필드를 모두 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)

SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table

매력처럼 작동


Another way is to use CONCATand CAST, be aware, that you need to use DATETIME2(x) to make it work. You can set x to anything between 0-7 7 meaning no precision loss.

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

Returns 2018-03-12 07:00:00.0000000

Tested on SQL Server 14


To combine date from a datetime column and time from another datetime column this is the best fastest solution for you:

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

SELECT CAST(CAST(@DateField As Date) As DateTime) + CAST(CAST(@TimeField As Time) As DateTime)


I ran into similar situation where I had to merge Date and Time fields to DateTime field. None of the above mentioned solution work, specially adding two fields as the data type for addition of these 2 fields is not same.

I created below solution, where I added hour and then minute part to the date. This worked beautifully for me. Please check it out and do let me know if you get into any issues.

;with tbl as ( select StatusTime = '12/30/1899 5:17:00 PM', StatusDate = '7/24/2019 12:00:00 AM' ) select DATEADD(MI, DATEPART(MINUTE,CAST(tbl.StatusTime AS TIME)),DATEADD(HH, DATEPART(HOUR,CAST(tbl.StatusTime AS TIME)), CAST(tbl.StatusDate as DATETIME))) from tbl

Result: 2019-07-24 17:17:00.000

참고URL : https://stackoverflow.com/questions/700619/how-to-combine-date-from-one-field-with-time-from-another-field-ms-sql-server

반응형