1つのフィールドの日付と別のフィールドの時刻を組み合わせる方法-MS SQL Server


198

私が扱っている抽出では、2つのdatetime列があります。1つの列には日付が格納され、別の列には時刻が表示されます。

テーブルにクエリを実行して、これら2つのフィールドを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

2つを単純に追加できます。

  • 場合Time partあなたのDate列は常にゼロであります
  • そしてDate part、あなたのTime列は常にゼロである(:1900年1月1日を基準日)

それらを追加すると、正しい結果が返されます。

SELECT Combined = MyDate + MyTime FROM MyTable

理論的根拠(kudos to ErikE / dnolan)

これは、日付が2つの4バイトとして格納される方法により Integers、左側の4バイトがdateで、右側の4バイトがであるので、このように機能しtimeます。そのように$0001 0000 + $0000 0001 = $0001 0001

新しいSQL Server 2008タイプに関する編集

DateおよびTimeは、で導入されSQL Server 2008たタイプです。追加を主張するなら、あなたは使うことができますCombined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)

SQL Server 2008以降での精度の低下に関するEdit2(Martin Smithのkudos)

見ていSQL ServerのDATETIME2に日付と時刻を組み合わせる方法を?SQL Server 2008以降を使用して精度の低下を防ぐため。


2
@Jon、日付列の時間要素と時間列の日付要素が両方ともゼロである限り、真です。
LukeH 2009年

1
あなたは、ほとんどの場合、ここでdesribedされているものを経験しているgroups.google.be/group/... ボーランド* +著者%の3A teamb *#1ab62659d8be3135
リーフェンKeersmaekers

2
SQL Serverの「ゼロ」の日付は1900-01-01です。
Andriy M

1
私がこれを試したとき、 'time'値をdatetimeにキャストする必要はありませんでした。つまり、次のことを実行できます。datetime+ time
Sam

1
SQLサーバーの@dnolan日付はとして保存されませんfloat。一体どこでこれを学びましたか?彼らは次のように保存されている整数:日付部分は、アンカー日からの日数であり、時間の部分は午前0時から、用1/300秒と定義されているティック「ティック」の数であるdatetimeと、より正確なtimedatetime2
ErikE 2013

129

あなたの日付列の時間要素場合お時間の列の日付要素の両方がゼロで、その後リーフェンの答えは何が必要です。常にそうであると保証できない場合は、少し複雑になります。

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

ルークの答えをありがとう。幸いにも、この場合、他のアイテムが常にゼロであることを保証できます。2つのフィールドは、抽出を行うサードパーティのコードの反対側でも1になる可能性があると思います。
Jon Winstanley

6
OPと同じ問題がありましたが、不要な部分がゼロになることはありません。したがって、これは計り知れないほど役に立ちました。

これは私を救った!私は両方を文字に変換してから連結してからDATETIMEに戻していましたが、SQLはそれが非決定的であると言っていたので、インデックスを付けることができませんでした。これは明らかに確定的です!!! ありがとう!!! 君は !!!
eidylon、2012年

4
SQL Server 2008のバージョンが機能しません。The data types datetime and time are incompatible in the add operator.
マーティン・スミス

@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
SQL Server 2008で素晴らしい仕事
トビアス

7
データ型datetimeとtimeは、add演算子で互換性がありません。SQL Server 2012のエラー
Devin Prejean

4
SQL 2012データ型datetimeとtimeは、add演算子で互換性がありません
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

日時フィールドに格納された最初の日付を文字列に変換し、次に日時フィールドに格納された時間を文字列に変換し、2つを追加して、すべて既知の変換形式を使用して日時フィールドに変換します。

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

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


0

もう一つの方法は、使用することですCONCATし、CASTあなたが使用する必要があることに、注意してDATETIME2(x)それを動作させるために。精度を失わないxことを0-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

「データ型datetimeとtimeは、add演算子では互換性がありません。」というエラーが発生します。
Oskar Berggren 2016年

-1

DateとTimeのフィールドをDateTimeのフィールドにマージしなければならない状況に遭遇しました。上記の解決策はいずれも機能せず、特に2つのフィールドを追加するためのデータ型として2つのフィールドを追加することは同じではありません。

以下のソリューションを作成しました。日付に時間と分の部分を追加しました。これは私にとっては美しく機能しました。ぜひチェックして、問題が発生した場合はお知らせください。

; 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

結果:2019-07-24 17:17:00.000

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.