从字符串解析动态构建日期

Dynamically Building Date from String Parse

我在我们的数据库中存储了一个字符串,它保存了一些针对我们视图的查询的预定数据。

例如数据库中的字符串示例是

userid=3,name=stuart, etc

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

userid={UID}

因此,当从数据库中读取它时,我只需对字符串进行替换以将其放入数据中;

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

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

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

例如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)} - 例如10 天后 DateTime.Now

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

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

这将使我能够灵活地在足够接近任何日期限制的情况下进行构建。理想情况下,也可以链接这些约束;

开始日期={-天(10)-月(1)-年(2)}

最好的方法是获取这些数据然后执行此操作。

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

例如从你的字符串中解析出这些之后:

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

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

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

StartDate=1,-2, 4

作为你的三个偏移量。

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