下面是我为将Server的内部DateTime表示(BINARY(8))转换为FILETIME而设置的例程。我知道SQL DateTime (在GetDate()中)是不精确的,并且将与SystemTimeAsFileTime不同。但是它应该是毫秒的,但是是秒的,对吗?
无论如何,这是我的例行公事,我想知道是否有人看到了它的缺陷:
int SQLDateTimeToFileTime(PULARGE_INTEGER t_sql, PULARGE_INTEGER t_ft)
{
ULONGLONG days = t_sql->LowPart;
ULONGLONG ticks = t_sql->HighPart;
days += (ULONGLONG) 109207; // 01/01/1900 - 01/01/1601
days *= (ULONGLONG) 864000000000; // (FT_SECONDS_PER_DAY * FT_SECOND);
ticks *= (ULONGLONG) 33333333333; // MS per tick (3.33...) * 10000);
ticks /= (ULONGLONG) 1000000; // to avoid floating point operation
days += ticks;
t_ft->QuadPart = days;
return(0);
}发布于 2014-08-30 17:44:31
0,但是您还没有说明为什么这对这种使用很重要(如果它是有意的)。由于它也不返回1或另一个失败的非0值,所以我假设它没有返回错误代码。否则,它应该返回void,然后删除return 0。constexpr在编译时对它们进行了评估。)或者为了简洁起见,他们可以使用auto:FT_SECONDS_PER_DAY = 24ULL * 60 * 60;constexpr自动FT_SECOND = 10000000ULL;发布于 2014-09-02 22:09:41
FT_SECOND是什么?这个名字也许应该是FT_ten_millionths_per_second或者更好的文档。根据原始代码行及其注释,它的值似乎为10,000,000。为什么?这似乎是武断的。需要更清楚地说明这一价值的原因。(3.33...) * 10000,但是代码在*= 33,333.333333中使用圆角值。最好用简单的数学来做*= 33,333.333333333333333333....。解释为什么10,000的比例是有用的。很可能是FT_SECOND/1000。// MS (3.33.)* 10000 = 10/3*10000蜱*= (超长龙)10*10000,蜱/= 3;https://codereview.stackexchange.com/questions/61560
复制相似问题