我开发了一个时事通讯系统,并使用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.

推荐答案

好吧,出于某种原因,你没有把date和 token 一起存储.然后,让我们首先看看如何计算令牌:

Convert.ToBase64String(time.Concat(key).ToArray())

也就是说,您有一个64位的基本字符串,它的前64位表示时间.剩下的就没什么意思了.

DateTime.UtcNow.ToBinary()

请参阅:https://learn.microsoft.com/en-us/dotnet/api/system.datetime.tobinary?view=net-7.0

BASE64_DECODE将在SQL Server中为您解码Base64字符串.现在,根据文档,结果是

返回类型

  • 变量二进制(8000).
  • 如果输入为varchar(Max),则为Varinary(Max).
  • 如果输入表达式为空,则输出为空.

现在,您想要从变量二进制中取get the range of bits,更准确地说是前64位,然后您打算将其转换为日期.将值转换为bigint后,可以将结果转换为datetime,请参见Convert bigint to datetime.

Csharp相关问答推荐

C# uwp中的Win11启动屏幕剪辑工作方式不同

使用yaml将Azure函数代码部署到FunctionApp插槽时出现问题(zip未找到)

如何创建ASP.NET Core主机并在同一进程中运行请求

Monty Hall游戏节目模拟给我50/50的结果

应该使用哪一个?"_counter += 1 OR互锁增量(ref_counter)"""

如何使用C#Interop EXCEL创建度量衡

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

如何使用新的Microsoft.IdentityModel.JsonWebToken创建JwtSecurityToken?

在路由中使用枚举

SortedSet.Remove()不会删除SortedSet.Min返回的元素

C#-VS2022:全局使用和保存时的代码清理

在swagger示例中添加默认数组列表

如果设置了另一个属性,则Newtonsoft JSON忽略属性

依赖项注入、工厂方法和处置困境

为什么Docker中没有转发该端口?

我可以强制System.Text.Json.JsonSerializer以非递归方式工作吗?

FakeItEasy自动嘲弄内容

Linq SELECT的多条指令

如何在.NET Core 8中自定义标识用户模型

无法将.Net Framework 4.8.1升级到.Net 7