sql_variantで計算をキャプチャする場合は、そのタイプを判断できます。あなたのケースでは、計算は正確なデータ型ではない数値型を使用し、丸めが発生している場所です。私はこのコードが見出されている
BaseType Precisions Scale TotalBytes Collation MaxLengths
numeric 38 18 17 NULL 13
:次の出力を生成し
DECLARE @myVar sql_variant = (@Ticks - 599266080000000000)/10000000/24/60/60
SELECT SQL_VARIANT_PROPERTY(@myVar,'BaseType') BaseType,
SQL_VARIANT_PROPERTY(@myVar,'Precision') Precisions,
SQL_VARIANT_PROPERTY(@myVar,'Scale') Scale,
SQL_VARIANT_PROPERTY(@myVar,'TotalBytes') TotalBytes,
SQL_VARIANT_PROPERTY(@myVar,'Collation') Collation,
SQL_VARIANT_PROPERTY(@myVar,'MaxLength') MaxLengths
をExtended.Net link
DECLARE @ticks bigint = 635953248000000000
-- First, we will convert the ticks into a datetime value with UTC time
DECLARE @BaseDate datetime;
SET @BaseDate = '01/01/1900';
DECLARE @NetFxTicksFromBaseDate bigint;
SET @NetFxTicksFromBaseDate = @Ticks - 599266080000000000;
-- The numeric constant is the number of .Net Ticks between the System.DateTime.MinValue (01/01/0001) and the SQL Server datetime base date (01/01/1900)
DECLARE @DaysFromBaseDate int;
SET @DaysFromBaseDate = @NetFxTicksFromBaseDate/864000000000;
-- The numeric constant is the number of .Net Ticks in a single day.
DECLARE @TimeOfDayInTicks bigint;
SET @TimeOfDayInTicks = @NetFxTicksFromBaseDate - @DaysFromBaseDate * 864000000000;
DECLARE @TimeOfDayInMilliseconds int;
SET @TimeOfDayInMilliseconds = @TimeOfDayInTicks/10000;
-- A Tick equals to 100 nanoseconds which is 0.0001 milliseconds
DECLARE @UtcDate datetime;
SET @UtcDate = DATEADD(ms, @TimeOfDayInMilliseconds, DATEADD(d, @DaysFromBaseDate, @BaseDate));
-- The @UtcDate is already useful. If you need the time in UTC, just return this value.
SELECT @UtcDate;
実際の日付と時刻の代わりにダニを使用すると、タイムゾーンの問題を*導入する方法のように聞こえますが、解決できません。 SQL Serverには、任意のベースティックと想定されるオフセットとの変換を必要とせずに、値自体にタイムゾーンを指定できる 'datetimeoffset'タイプがあります –
データベースのフロントエンドとdatetimeoffsetでDateTimeOffsetを使用しないのはなぜですか?それは仮定されたUTCオフセットでダニを使用するときにまだ残っているあいまいさを取り除きます。 –