我有一个webform,它在Access数据库中查询日记条目,并提供有关它们的各种统计信息;例如,向我提供特定主题的日记帐分录总数和日记帐分录总数。我想要的是能够输入开始日期和结束日期,并计算这两个日期之间的日记帐分录总数。
到目前为止,我有两个带有jquery日历的文本框,但是当选择了两个日期并单击了搜索按钮时,它没有获取正确数量的日记帐分录总数并返回0.
日期时间选择器将日期放入如下格式:mm / dd / yyyy,Access数据库将JournalDate字段格式化为日期/时间。换句话说,Access数据库将日期保留为2014年4月8日,DataTime Picker将其显示在文本框中为04/08/2014。我认为使用parse转换它们会起到作用,但是当选择日期时,它仍然会返回0作为日记条目的总数。非常感谢任何帮助。
现在它也对SQLInjection开放。
DateTime StartDate = DateTime.Parse(txtStartDate.Text);
DateTime EndDate = DateTime.Parse(txtEndDate.Text);
using (OleDbConnection con = new OleDbConnection(constr))
using (OleDbCommand com = new OleDbCommand("SELECT * FROM JournalEntries WHERE JournalDate BETWEEN " + txtStartDate.Text + " and " + txtEndDate.Text, con))
{
con.Open();
using (OleDbDataReader myReader = com.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(myReader);
int count = dt.Rows.Count;
JournalEntryTotal.Text = count.ToString();
}
}
答案 0 :(得分:1)
很可能是日期转换问题。
我认为在没有明确提供格式的情况下解析日期时间字符串字段通常是一种很好的做法。例如,您的txtStartDate
是2014年4月8日的2014年4月4日,而txtEndDate
是2014年5月3日的05/03/2014,在这些日期之间搜索记录是有意义的,但如果默认格式为dd / MM / yyyy,您将分别获得2014年8月4日和2014年3月5日的开始日期和结束日期,并且在这些日期之间搜索数据会产生0个结果。
同样,在您运行的SQL查询中,您应该使用日期转换功能,而不是依赖于默认格式。所以它应该读取这样的东西(我使用的是oracle日期转换函数,但在访问时应该有类似的东西):
"SELECT * FROM JournalEntries WHERE JournalDate BETWEEN to_date('" + txtStartDate.Text + "', 'mm/dd/yyyy') and to_date('" + txtEndDate.Text + "', 'mm/dd/yyyy')"
关于日期字段和格式的另一个词。日期没有格式。日期表示特定时刻。 2014年8月10日美国东部时间10:23:05无论你如何写它都是同一天。当你编写它时,你使用一种格式来显示它,这样任何读它的人都能理解你所指的那个时刻。
答案 1 :(得分:0)
我首先调整查询本身,即在MS SQL maangement studio中,然后将日期格式化为正确的格式,即:
Format(Me.DateTimePicker1.Value, "MM/dd/yyyy")
如果您尝试过,我怀疑您的问题是格式字符串的大写/小写。注意,那个月是大写,而其余的是小写(重要!)。不像你上面写的那样:mm / dd / yyyy。
此致
Libor的