web-dev-qa-db-ja.com

日付と時刻を組み合わせて(連結して)日時にする

SQL Server 2008を使用すると、このクエリはうまく機能します。

select CAST(CollectionDate as DATE), CAST(CollectionTime as TIME)
from field

このような2つの列を提供します。

2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
    .
    .
    .

次のように、プラス記号を使用してそれらを単一の日時に結合しようとしています:

select CAST(CollectionDate as DATE) + CAST(CollectionTime as TIME)
from field

私はこのサイトでの回答を含む10個のWebサイト( this one など)を調べましたが、プラス記号が機能するはずであることに全員が同意しているようですが、エラーが発生します:

メッセージ8117、レベル16、状態1、行1
演算子のデータ型の日付は、演算子の追加には無効です。

すべてのフィールドは非ゼロおよび非ヌルです。 CONVERT関数も試し、これらの結果をvarcharとしてキャストしようとしましたが、同じ問題があります。これは私が作っているほど難しくありません。

誰かがこれがうまくいかない理由を教えてもらえますか?助けてくれてありがとう。

24
Stanton

基礎となるデータ型が日付/時刻/日付時刻などであると仮定します.

SELECT CONVERT(DATETIME, CONVERT(CHAR(8), CollectionDate, 112) 
  + ' ' + CONVERT(CHAR(8), CollectionTime, 108))
  FROM dbo.whatever;

そうでない場合、WHY NOT、そして意味のある答えを得るには、どのタイプを教えてくださいデータが保存されている形式、およびテーブルを修正するだけです。

38
Aaron Bertrand

代わりにdatetimeにキャストしてください:

select CAST(CollectionDate as DATETIME) + CAST(CollectionTime as TIME)
from field

これは、SQL Server 2008 R2で機能します。

何らかの理由で最初の部分に時間コンポーネントがないことを確認したい場合は、最初にフィールドを日付にキャストしてから、datetimeに戻します。

9
Amy

シンプルなソリューション

SELECT CAST(CollectionDate as DATETIME) + CAST(CollectionTime as DATETIME)
FROM field
8
Park Keeper

より簡単なソリューション(SQL Server 2014 SP1 CU6でテスト済み)

コード:

DECLARE @Date date = SYSDATETIME();

DECLARE @Time time(0) = SYSDATETIME();

SELECT CAST(CONCAT(@Date, ' ', @Time) AS datetime2(0));

これは、特定の日付と特定の時間フィールドを持つテーブルがあれば機能します。 2つの別々のフィールドで日付と時刻を使用するベンダーデータがあるため、この方法を頻繁に使用します。

7
texasrebelaggie
DECLARE @ADate Date, @ATime Time, @ADateTime Datetime

SELECT @ADate = '2010-02-20', @ATime = '18:53:00.0000000'

SET @ADateTime = CAST   (
    CONVERT(Varchar(10), @ADate, 112) + ' ' +   
    CONVERT(Varchar(8), @ATime) AS DateTime)

SELECT @ADateTime [A Nice datetime :)]

これにより、有効な結果が表示されます。

1
Elken
drop table test

create table test(
    CollectionDate date NULL,
    CollectionTime  [time](0) NULL,
    CollectionDateTime as (isnull(convert(datetime,CollectionDate)+convert(datetime,CollectionTime),CollectionDate))
-- if CollectionDate is datetime no need to convert it above
)

insert test (CollectionDate, CollectionTime)
values ('2013-12-10', '22:51:19.227'),
       ('2013-12-10', null),
       (null, '22:51:19.227')

select * from test

CollectionDate  CollectionTime  CollectionDateTime
2013-12-10      22:51:19        2013-12-10 22:51:19.000
2013-12-10      NULL            2013-12-10 00:00:00.000
NULL            22:51:19        NULL
0
dinok

これはSQL 2008および2012で機能し、datetime2を生成します。

declare @date date = current_timestamp;
declare @time time = current_timestamp;

select 
@date as date
,@time as time
,cast(@date as datetime) + cast(@time as datetime) as datetime
,cast(@time as datetime2) as timeAsDateTime2
,dateadd(dayofyear,datepart(dayofyear,@date) - 1,dateadd(year,datepart(year,@date) - 1900,cast(@time as datetime2))) as datetime2;
0
same

日付を扱う場合、dateaddは精度のために使用する必要があります

declare @a DATE = getdate()
declare @b time(7) = getdate()
select @b, @A, GETDATE(), DATEADD(day, DATEDIFF(day, 0, @a), cast(@b as datetime2(0)))
0
Gaurav Aote

SQL Server 2016を使用していますが、myDateフィールドとmyTimeフィールドの両方が文字列です。以下のtsqlステートメントは、それらをdatetimeに連結する際に機能しました

select cast((myDate + ' ' + myTime) as datetime) from myTable
0