从String Parse动态构建日期

时间:2015-10-21 04:54:22

标签: c# datetime replace text-parsing

我的数据库中存储了一个字符串,其中包含我们视图的某些查询的预定数据。

e.g。 db中字符串的一个示例是

  

userid = 3,name = stuart等

目前在一些带占位符的特殊情况下,允许我在运行时动态设置一些数据(无需用户输入),如

  

的userid = {UID}

所以当从db中读取它时,我只需在字符串中替换数据中的sub;

string.Replace("{UID}", User.ID);

有效地允许我限制视图并预先确定返回给它们的数据。我现在的任务是在日期中添加更加动态的方法。

我们还有其他日期字段,如StartDate和EndDate,到目前为止只有硬编码日期来限制显示的数据;

e.g。 StartDate = 2015/10/21,EndDate = 2015/11/21(即yyyy / MM / dd)

这些需要变得更加灵活,例如我可以显示当前月份数据,季度数据,年度数据等。

我的想法是坚持使用相同的占位符类型并添加类似的内容;

StartDate = { - Days(10)} - 对于DateTime.Now前10天的StartDate

StartDate = { - Months(3)} - 例如在DateTime.Now之前的3个月

StartDate = { - Years(1)} - 例如从DateTime.Now

减去一年

StartDate = {+ Days(10)} - 例如DateTime.Now

将来10天

然后我会使用EndDate执行类似的过程。

EndDate = { - Months(10)} - 例如从DateTime.Now等减去10个月

这将使我能够灵活地建立足够的日期限制。理想情况下,也可以将这些约束链接起来;

StartDate = { - Days(10)-Months(1)-Years(2)}

最好的办法是抓住这些数据,然后再这样做。

1 个答案:

答案 0 :(得分:1)

大概你只需要你建议的三个偏移量(日,月和年可以是正数或负数),然后你可以使用DateTime的AddDays / Months / Years方法来获取你需要的日期并相应地格式化它你的查询。

E.g。从字符串中解析出来之后:

String formattedDate =  DateTime.Date.AddDays(days).AddMonths(months).AddYears(years).ToString("<database specific date format!>");

此示例使用.Date而不是.Now,因此没有时间元素。

在存储这些偏移量方面,您可以使用与您建议的格式相似的格式,例如:

StartDate=1,-2, 4

作为你的三个补偿。

话虽如此,我怀疑你在数据库中拥有一个包含所有这些过滤器选项的特定字段的表要好得多,而不是解析字符串来获取它们。换句话说,在这个例子中,你有三个字段用于日,月和年偏移。这样做的好处是,您可以在SQL中执行所有操作,并且您将获得更高效和优化的查询。当然,您可能无法更改此设计,您只需要使用它,但我建议您测试当前的性能和数据库负载方法,因为您可能会在将来遇到问题。