web-dev-qa-db-ja.com

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

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

これらの2つのフィールドをdatetime型の1つの列に結合するためにテーブルをクエリするにはどうすればよいですか?

日付

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
184
Jon Winstanley

あなたは単純に二つを追加することができます。

  • Date列のTime partが常にゼロの場合
  • およびTime列のDate partも常にゼロです(基準日:1900年1月1日)

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

SELECT Combined = MyDate + MyTime FROM MyTable

理論的根拠(ErikEへの称賛/ドノラン)

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

新しいSQL Server 2008の種類に関する編集

DateTimeSQL Server 2008で導入された型です。追加したい場合は、Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)を使用できます。

SQL Server 2008以降での精度の低下に関する編集2(Martin Smithに賛辞)

SQL Server 2008以降での精度の低下を防ぐために、 SQL Serverでdatetime2にdateとtimeを組み合わせる方法は? をご覧ください。

241

あなたの日付列の時間要素あなたの時間列の日付要素が両方ともゼロなら、 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
126
LukeH

これはchar変換を行わない別の解決策です。

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

この方法ではミリ秒の精度しか得られませんが、通常はそれで問題ありません。私はこれをSQL Server 2008でテストしました。

23
Jojje

これは私のために働きました

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

(SQL 2008 R2の場合)

11
biso
  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. Date&Timeデータ型を使用した場合は、単にtimetimeに時間をキャストしてください。

    例えば:

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

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
CraigTP

Datetimeフィールドに格納されている最初の日付を文字列に変換してから、datetimeフィールドに格納されている時刻を文字列に変換し、2つを追加してdatetimeフィールドに変換します。

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

両方のフィールドを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
Alex Briones
SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table

魅力のように働く

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
1

私は上記のように多くのエラーがあったので、私はこのようにしました

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

それは私のために働きました。

1
Tom

もう1つの方法は、CONCATCASTを使用することです。動作させるにはDATETIME2(x)を使用する必要があることに注意してください。 x0-77の間の任意の値に設定できます。これは精度が低下しないことを意味します。

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でテスト済み

0
LuckyLikey