如何在DB上处理与日期相关的状态激活?

时间:2012-05-22 18:11:37

标签: java mysql datetime talend

我的问题是双重的。我试图尽可能优雅地处理它。

提供以下格式的日期,

 YYYYMMDD hh:mm:ss

如何找到可变天数的相应日期?例如,如果给定日期,我需要能够在距离那时“x”天找到该格式的相应日期。

这个生成日期是我存储在数据库的activation_date列中的日期。然后我想每晚查询数据库,看看它是不是那个日期。如果是这样,我会将不同列中项目的状态从挂起更改为活动。

这似乎是处理我的问题的最好方法,但似乎并不是很容易解决。

另一种方法是我在数据库中创建一个days_till_activation列,并有一个脚本,每晚为每个条目递减该列中的值,直到达到零。达到零后,脚本将更改状态。这个问题是处理数据库似乎是一种非常糟糕的方式。它涉及大量写入数据库,而不是仅在需要时才这样做。

无论如何,任何想法都会受到赞赏。我需要在java中处理解决方案,但伪代码会很好。

2 个答案:

答案 0 :(得分:1)

  

提供以下格式的日期,

YYYYMMDD hh:mm:ss

这是你的第一个问题。 不要考虑特定格式的日期。确保数据库模式使用适当的日期/时间字段类型,并在Java代码中使用适当的类型。除非您向用户显示字符串表示,否则您永远不需要查看字符串表示。

幸运的是,这部分很简单:

  

如何找到可变天数的相应日期?

我建议尽可能使用Joda Time来表示您的日期和时间值。这很容易:

LocalDate date = ...;
LocalDate activation = date.plusDays(activationDays);

可以只使用java.util.Date / Calendar,但我建议您在从数据库中提取数据时尽快转换为Joda时间类型,并在最后可能的时刻转换回本机Java类型。这样你就可以在尽可能多的时间内避免Java类型的可怕性。

答案 1 :(得分:0)

在这种情况下,我会选择一个包含到期时间戳(currentTimeMilis() + x * MILLIES_PER_DAY)的整数类型列,使您的查询非常简单(where expiration < ?将参数绑定到currentTimeMilis()。)

选择日期/时间类型列会增加解决方案的复杂性,使得行为依赖于数据库安装(操作系统语言更改会产生影响。)