解决问题:需要给用户界面,让用户自定义查询的数据,但是数据查询期间的处理比较头痛。
比如需要查询上周1-周7的数据,本月1日到今天的数据。
private string DealFun(string str)
{
//(YESTERDAY)TODAY.-1.MONDAY.FIRSTDAY.LASTDAY
//(昨天)今天.-1.星期一.月份第1天.月份最后1天
int i_funStart, i_funEnd;
string funStr;
DateTime dt = DateTime.Today;
i_funStart = str.IndexOf("[#");
while (i_funStart >= 0) //处理完所有的函数了
{
i_funEnd = str.IndexOf("#]", i_funStart + 2);
if (i_funEnd == -1)
{
return "ERROR";//找不到结束符
}
funStr = str.Substring(i_funStart + 2, i_funEnd - i_funStart - 2);
string[] funs = funStr.Split('.');
for (int i = 0; i < funs.Length; i++)
{
if (i == 0)
{
switch (funs[i])
{
case "TODAY":
dt = DateTime.Today;
break;
case "YESTERDAY":
dt = DateTime.Today.AddDays(-1);
break;
default:
return "ERROR"; //第一个必须是日期
}
}
else
{
if (funs[i].Substring(0, 1) == "-")
{
dt = dt.AddDays(Convert.ToInt16(funs[i].Replace("-", "")) * (-1));
}
else if (funs[i].Substring(0, 1) == "+")
{
dt = dt.AddDays(Convert.ToInt16(funs[i].Replace("-", "")));
}
else
{
switch (funs[i])
{
case "MONDAY":
//DayOfWeek: Sunday=0 Monday=1
int days = Convert.ToInt16(dt.DayOfWeek) == 0 ? 6 : Convert.ToInt16(dt.DayOfWeek) - 1;
dt = dt.AddDays(days * (-1));
break;
case "FIRSTDAY":
dt = dt.AddDays((-1) * dt.Day + 1);
break;
case "LASTDAY":
dt = dt.AddDays((-1) * dt.Day + 1);//月份第1天
dt = dt.AddMonths(1).AddDays(-1);//本月最后1天
break;
default:
return "ERROR";
}
}
}
}
//将结果替换到字符串中
str = str.Replace("[#" + funStr + "#]", dt.ToString("yyyy-MM-dd"));
//查找下一个函数
i_funStart = str.IndexOf("[#");
}
return str;
}
//调用示例:要查询上周1到上周日的数据
sql = "select * from Table1 Where AccountDate between '[#TODAY.-7.MONDAY#]' and '[#TODAY.-7.MONDAY.+6#]'";
textBox1.Text = DealFun(sql);
// 结果:select * from Table1 Where AccountDate between '2018-09-17' and '2018-09-23'
/* 调用说明:
* 1、字符串里可以有N个函数,每个函数据必须写在"[#" 和 "#]"之内
* 2、关键字:
* YESTERDAY 昨天, TODAY 今天, MONDAY 周一, FIRSTDAY 月份第1天, LASTDAY 月份最后1天
* 3、开始的关键字必须是YESTERDAY或是TODAY
* 4、每个关键字间必须用.分隔,如:TODAY.MONDAY,代表:本周1的日期
* 5、运算符(+ -)的用法:
* 运算符前必须有. ,如:
* TODAY.-7 今天向后倒退7天(上一周的这一天)
* TODAY.-7.MONDAY 上周一
* TODAY.FIRSTDAY.-1.FIRSTDAY 今天.本月第1天.-1天.月第1天=上个月的第1天
*/
//函数的内容,大家可以参考这个架构继续补充。