データ型の優先順位 (Transact-SQL)にて SQLServer2008に新たに増えたデータ型「datetimeoffset」「datetime2」は
datetimeよりも優先順位が上に書かれています。
では、本当にそうなのか検証してみます。
まずは、データ型をチェックする関数を作成します。
create function [dbo].[GetProp](@col as sql_variant)
returns
@ret table(
[BaseType] varchar(max),
[Precision] int,
[Scale] int,
[TotalBytes] int,
[Collation] varchar(max),
[MaxLength] int
)
begin
insert into @ret
select
cast(SQL_VARIANT_PROPERTY (@col,'BaseType') as varchar(max)) as 'BaseType',
cast(SQL_VARIANT_PROPERTY (@col,'Precision') as int) as 'Precision',
cast(SQL_VARIANT_PROPERTY (@col,'Scale') as int) as 'Scale',
cast(SQL_VARIANT_PROPERTY (@col,'TotalBytes') as int) as 'TotalBytes',
cast(SQL_VARIANT_PROPERTY (@col,'Collation') as varchar(max)) as 'Collation',
cast(SQL_VARIANT_PROPERTY (@col,'MaxLength') as int) as 'MaxLength';
return;
end ;
では、この関数を使って、
- datetime + datetimeoffset
- datetime + datetime2
2パターンの加算をしてみたいと思います。
SELECT * FROM
GetProp(
CAST('2007-01-01 23:59:59' as datetime)
+
CAST('1900-01-01 00:00:01.000' as datetime2)
)
SELECT * FROM
GetProp(
CAST('2007-01-01 23:59:59' as datetime)
+
CAST('1900-01-01 00:00:01.000 -9:00' as datetimeoffset)
)
この2つのSQLを実際に動かした結果は以下のとおりです。
BaseType |
Precision |
Scale |
TotalBytes |
Collation |
MaxLength |
datetime |
23 |
3 |
10 |
NULL |
8 |
datetime |
23 |
3 |
10 |
NULL |
8 |
あれ・・・・って感じですよね。
GetProp関数内で使用しているSQL_VARIANT_PROPERTYが未対応なのかしら?と思って、
テーブルを作成してみました。
CREATE TABLE [dbo].[tb2](
[dto] [datetimeoffset](7) NOT NULL,
[dt] [datetime] NOT NULL,
[dto+dt] AS ([dto]+[dt])
) ON [PRIMARY]
これにデータを1件突っ込んで表示させてみました。
dto |
dt |
dto+dt |
1900-01-02 00:00:01.0000000 -09:00 |
2007-01-01 23:59:59.000 |
2007-01-03 00:00:00.000 |
どうみてもdatetimeですね・・・・。
う~んと、とりあえずMSDNライブラリからフィードバック流しておいたけど、
他にしておく事はあるかしらん?
#ちなみにsmalldatetimeでも同様にsmalldatetimeの勝ち!でした・・・
#またまた追記
# timestamp(30)+varbinary(1) = varbinary(16byte maxlength=70)
# timestamp(30)+binary(1) = varbinay (42byte maxlength=70)
#またまたまたまた追記
# nchar + varchar = nvarchar