Тип данных временной метки MS SQL Server семантически эквивалентен двоичному (8) (если не обнуляемый) или varbinary (8) (если обнуляемый).Следовательно, сравнивайте их как массивы байтов.
Не говоря уже о том, что при конвертации в long возникают накладные расходы.Вы можете написать некоторый небезопасный код, чтобы получить адрес байтовых массивов, привести их к длинным указателям и разыменовать их в длинные, НО это безопасно означает закрепление их в памяти и кучу уродливого кода, чтобы сделать что-то по существу простое (и, вероятно,не быстрее, чем использование BitConverter).
Самый быстрый способ сделать это, если производительность действительно так критична, самый быстрый способ - сделать сравнение, используя функцию memcmp () стандартной библиотеки C через P / Invoke:
using System;
using System.Runtime.InteropServices;
namespace TestDrive
{
class Program
{
static void Main()
{
byte[] a = { 1,2,3,4,5,6,7,8} ;
byte[] b = { 1,2,3,4,5,0,7,8} ;
byte[] c = { 1,2,3,4,5,6,7,8} ;
bool isMatch ;
isMatch = TimestampCompare( a , b ) ; // returns false
isMatch = TimestampCompare( a , c ) ; // returns true
return ;
}
[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
static extern int memcmp(byte[] x , byte[] y , UIntPtr count ) ;
static unsafe bool TimestampCompare( byte[] x , byte[] y )
{
const int LEN = 8 ;
UIntPtr cnt = new UIntPtr( (uint) LEN ) ;
// check for reference equality
if ( x == y ) return true ;
if ( x == null || x.Length != LEN || y == null || y.Length != LEN )
{
throw new ArgumentException() ;
}
return ( memcmp( x , y , cnt ) == 0 ? true : false ) ;
}
}
}