私が扱っている抽出では、私は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
あなたは単純に二つを追加することができます。
Date
列のTime part
が常にゼロの場合Time
列のDate part
も常にゼロです(基準日:1900年1月1日)それらを追加すると正しい結果が返されます。
SELECT Combined = MyDate + MyTime FROM MyTable
日付が2つの4バイトの
Integers
として格納され、左の4バイトがdate
で、右の4バイトがtime
であるため、これはこのように機能します。$0001 0000 + $0000 0001 = $0001 0001
をするのが好き
Date
とTime
はSQL Server 2008
で導入された型です。追加したい場合は、Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)
を使用できます。
SQL Server 2008以降での精度の低下を防ぐために、 SQL Serverでdatetime2にdateとtimeを組み合わせる方法は? をご覧ください。
あなたの日付列の時間要素とあなたの時間列の日付要素が両方ともゼロなら、 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の場合)
両方のフィールドが日時の場合は、単純に追加するだけでうまくいきます。
例えば:
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
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)
それはラフで準備ができています、しかしそれはうまくいきます!
Datetimeフィールドに格納されている最初の日付を文字列に変換してから、datetimeフィールドに格納されている時刻を文字列に変換し、2つを追加してdatetimeフィールドに変換します。
Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103)
両方のフィールドを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
魅力のように働く
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
それは私のために働きました。
もう1つの方法は、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でテスト済み