【问题标题】:Comparing SQL datetime to C# DateTime.Now将 SQL 日期时间与 C# DateTime.Now 进行比较
【发布时间】:2019-10-14 09:44:49
【问题描述】:

我一直在尝试为以下问题找到合适的解决方案。我有一个带有时间列的 SQL 表(格式为:hh:mm:ss)。它包含一个程序的开始时间。

我现在想比较从所述列到 DateTime.Now 的时间,并且只要列中的时间与现在的时间相同,就应该调用一个方法(例如)。

我现在有几个问题:

  1. 我通常使用 string startingtime = cmdx.ExecuteScalar().ToString(); 从 SQL 表中获取值,但我不确定在这里将时间转换为字符串是否聪明

  2. 我的程序是一个 Windows 服务,并且将始终运行,我不确定在比较 SQL 表的时间和现在的时间时使用秒是否明智,因为即使是 1 秒的差异也可能意味着方法不会被调用。

我的第一次尝试是这样的:

string startingtime = cmdx.ExecuteScalar().ToString();         
string timenow = DateTime.Now.ToString("HH:mm:ss");

var u1 = TimeSpan.Parse(timenow);
var u2 = TimeSpan.Parse(startingtime);
Console.WriteLine(u1 - u2);

然后我可以使用u1u2 之间的差异,假设它是否小于一分钟程序应该启动。 这是一个不错的解决方案,但可能有更好的方法,我期待您的解决方案。 提前致谢

【问题讨论】:

  • 我是否理解正确,您获取所有行,然后在代码中决定要处理哪个?为什么不首先查询“where time x2”? (x1 和 x2 是所需的时间范围)

标签: c# sql datetime


【解决方案1】:

您应该使用TimeOfDay 属性,而不是将当前日期转换为字符串然后使用TimeSpan.Parse(),因为它已经返回TimeSpan

string startingtime = cmdx.ExecuteScalar().ToString();         

var u1 = DateTime.Now.TimeOfDay;
var u2 = TimeSpan.Parse(startingtime);
Console.WriteLine(u1 - u2);

然后,将时间差与某个阈值进行比较应该是可行的方法。你可以使用这样的东西:

TimeSpan diff = u1 - u2;
if (diff.TotalSeconds > 60)
{
    // Call your method here.
}

此外,根据数据库中列的类型,您可能不需要调用.ToString() 并解析结果。如果它是一个日期类型,这样的东西可以工作:

var u2 = ((DateTime)cmdx.ExecuteScalar()).TimeOfDay;

否则,如果是字符串列,那么TimeSpan.Parse(startingtime)就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多