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としてキャストしようとしましたが、同じ問題があります。これは私が作っているほど難しくありません。
誰かがこれがうまくいかない理由を教えてもらえますか?助けてくれてありがとう。
基礎となるデータ型が日付/時刻/日付時刻などであると仮定します.
SELECT CONVERT(DATETIME, CONVERT(CHAR(8), CollectionDate, 112)
+ ' ' + CONVERT(CHAR(8), CollectionTime, 108))
FROM dbo.whatever;
そうでない場合、WHY NOT、そして意味のある答えを得るには、どのタイプを教えてくださいデータが保存されている形式、およびテーブルを修正するだけです。
代わりにdatetime
にキャストしてください:
select CAST(CollectionDate as DATETIME) + CAST(CollectionTime as TIME)
from field
これは、SQL Server 2008 R2で機能します。
何らかの理由で最初の部分に時間コンポーネントがないことを確認したい場合は、最初にフィールドを日付にキャストしてから、datetime
に戻します。
シンプルなソリューション
SELECT CAST(CollectionDate as DATETIME) + CAST(CollectionTime as DATETIME)
FROM field
より簡単なソリューション(SQL Server 2014 SP1 CU6でテスト済み)
コード:
DECLARE @Date date = SYSDATETIME();
DECLARE @Time time(0) = SYSDATETIME();
SELECT CAST(CONCAT(@Date, ' ', @Time) AS datetime2(0));
これは、特定の日付と特定の時間フィールドを持つテーブルがあれば機能します。 2つの別々のフィールドで日付と時刻を使用するベンダーデータがあるため、この方法を頻繁に使用します。
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 :)]
これにより、有効な結果が表示されます。
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
これは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;
日付を扱う場合、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)))
SQL Server 2016を使用していますが、myDate
フィールドとmyTime
フィールドの両方が文字列です。以下のtsqlステートメントは、それらをdatetime
に連結する際に機能しました
select cast((myDate + ' ' + myTime) as datetime) from myTable