我开发了一个时事通讯系统,并使用GUID和当前日期生成唯一令牌:
public static string GetUniqueToken()
{
byte[] time = BitConverter.GetBytes(DateTime.UtcNow.ToBinary());
byte[] key = Guid.NewGuid().ToByteArray();
return Convert.ToBase64String(time.Concat(key).ToArray());
}
我还有一个函数可以检索这个日期,并找出它是否已经过期(24小时后).
public static DateTime GetDateFromToken(string token)
{
byte[] data = Convert.FromBase64String(token);
return DateTime.FromBinary(BitConverter.ToInt64(data, 0));
}
现在,我想通过一个SQL查询删除过期的令牌,以避免每次都要遍历C#中的所有行并运行一个测试.我没能做到的是
提前谢谢你
我开始开发一段SQL代码来完成这种 suppress 工作,而不是使用贪婪的C#代码. 我不能让它工作
DECLARE @limitDate DATETIME;
SET @limitDate = DATEADD(HOUR, -48, GETDATE());
DELETE FROM newsletter
WHERE DATEADD(SECOND,
CONVERT(BIGINT, CONVERT(VARBINARY(MAX), SUBSTRING(token, 37, 8), 2)) / 10000, '19700101') < @limitDate;
生成的令牌示例:
Akias1XZ20jFoDOnWSZfRqgFHdv+UUUVP
它说:
Msg 8114, Level 16, State 5, Line 6
Error converting data type nvarchar to varbinary.