在C#中创建日期提醒

时间:2018-02-13 14:25:05

标签: c# sql-server

我创建了一个c#应用程序,需要在表单加载后在datagridview上显示,该数据视图将填充几乎已过期的条目(到期日期前1个月)。问题是我有一个本地数据库,我必须将当前时间与到期日期进行比较。非常感谢! 有查询:

SELECT  *  FROM [Table] WHERE datediff(month,expirationdate,CURRENT_DATE())<1

2 个答案:

答案 0 :(得分:0)

我有3个关于处理DateTimes的基本规则:

  1. 始终存储,传输和检索(STR)UTC值。如果您有客户端应用程序,它可以将其转换为当前计算机时区(从Windows中检索)。你真的不想mess with Timezones。只有使用WebServers才能拥有它。
  2. 避免STR字符串格式。
  3. 如果你无法避免字符串中的STR,至少在所有端点选择一个固定的文化格式和字符串编码。你不想在问题中加入那些内容。
  4. 如果您遵循这些规则,则执行处理变得简单:

    DateTime dueTime //set someplace else
    
    if(DateTime.Now.AddMonth(-1) >= dueTime)
      //Due time is in one month or less
    

答案 1 :(得分:0)

CURRENT_DATE是MySql和Oracle数据库系统中的一个函数。在SqlServer中,您使用GetDate() function. 但是更改该功能是不够的,因为您的查询中存在其他问题,我认为您应该将其更改为:

SELECT  * FROM [Table] WHERE expirationdate >= GetDate() 
                       AND datediff(month, GetDate(), expirationdate) between 0 and 1

请注意,datediff的第二个参数是 startdate ,第三个是 enddate 。如果您的逻辑是查找到期日期距离今天不到一个月的所有记录,那么 expirationdate 值将用于 enddate 参数和当前日期是开始日期。我还假设您过去并不想要几天,因此我还添加了一个检查,以排除比今天更低的每个 expirationdate

这个解决方案是错误的,因为它仍然包含月份部分相差1个整数的日期。但当前日期为2018年2月13日时,2018年3月18日的失效日期将包括在内,因为3和2之间的差异仍为1。

如果您想要更精确,那么您应该在几天内搜索差异而不是几个月。

SELECT  * FROM [Table] WHERE expirationdate >= GetDate() 
                       AND datediff(day, GetDate(), expirationdate) <= 30

这里我使用了一个月的30天的标准化值。