2013-09-04 5 views
16

に(連結)の日付と時刻を組み合わせることで、このクエリは素晴らしい作品:私は結合しようとしているは、SQL Server 2008を使用して日時

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 

は私にこのような2つの列を与えます

私は約10のWebサイトを見てきました。答えは以下のとおりです。 nは、このサイト(のようなthis one)、そしてそれらはすべてプラス記号が動作する必要があることに同意しているようだが、私はエラーを取得:

Msg 8117, Level 16, State 1, Line 1
Operand data type date is invalid for add operator.

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

誰かがなぜこれが機能しないのか教えていただけますか?助けてくれてありがとう。

+1

? (YYYY-MM-DD、YYYYMMDDなど) – Lamak

+0

実際には、クエリ自体で自分のデータをキャスト(または変換)しているなら、あなたと@Aaron Bertrandの質問にフォローアップします。文字列や日付として?私はdatetimeフィールドとして格納していますが、好奇心が強いだけです。 – Stanton

+0

@Stanton確かに問題ありません。あなたが必要でないときに、なぜキャスト/変換の2つのレベルを通過するのですか? –

答えて

30

など、基礎となるデータ型は、日付/時刻/日付時刻です
SELECT CONVERT(DATETIME, CONVERT(CHAR(8), CollectionDate, 112) 
    + ' ' + CONVERT(CHAR(8), CollectionTime, 108)) 
    FROM dbo.whatever; 

と仮定すると、この機能を有しており、意味のある回答を得るには、データの種類とデータの格納形式を教えてください。または、テーブルを修正するだけです。代わりにdatetime

+0

Aaron、あなたの返事のおかげで、上記の質問への洞察が高く評価されます。 – Stanton

+0

sql-server-2012で動作します。ニースジョブ – FirebladeDan

-4

使用連結方式のMySQLは、彼らは、なぜない場合

+0

これはSQL Server用です – Lamak

+0

これはMS SQL 2008では動作しません。 – Stanton

+0

それはできません。 concatは文字列関数です。 – Amy

7

キャストは:

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

これは、SQL Server 2008 R2上で動作します。

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

+2

'メッセージ402、レベル16、状態1、行1 - データ型datetimeとtimeは、加算演算子では互換性がありません。 ' –

+0

ブルズアイ!本当にありがとう! – Stanton

+0

@AaronBertrand、どのバージョンのSQL Serverを使用していますか? – Amy

1
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 :)] 

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

0
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

これはDATETIME2を生成するためにSQL 2008と2012で動作します:

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; 
-1
SELECT CONVERT(DATETIME, CONVERT(CHAR(8), date, 112) + ' ' + CONVERT(CHAR(8), time, 108)) 
    FROM tablename 
5

(SQL Serverの2014 SP1のCU6上でテスト)簡単に解決

コード:

DECLARE @Date date = SYSDATETIME(); 

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

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

これは、sp特定の時間フィールドとを含む。 2つの別々のフィールドで日付と時刻を使用するベンダーデータがあるということを考えれば、このメソッドを頻繁に使用します。

3

シンプルなソリューション彼らは文字列は、どのようにデータが格納されている場合は、各列の元のデータ型ですか?、何

SELECT CAST(CollectionDate as DATETIME) + CAST(CollectionTime as DATETIME) 
FROM field