none
有关SQlite的一个困惑的问题 RRS feed

  • 问题

  • 程序代码如下:
    sqlTime = "select SUM(onlineTimeSpan) From T_OnlineTimeSum where ipAddress = :a AND onlineDate BETWEEN :b AND :c";
                    daSpan = new SQLiteDataAdapter(sqlTime, conn);
                    daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("a", DbType.String));
                    daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("b", DbType.String));
                    daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("c", DbType.String));

                    daSpan.SelectCommand.Parameters[0].Value = Address;
                    daSpan.SelectCommand.Parameters[1].Value = startDate.Date.ToString("yyyy-MM-dd");
                    daSpan.SelectCommand.Parameters[2].Value = endDate.Date.ToString("yyyy-MM-dd");
    这样写查询时间天数是一位的准确的比如 如下:
    select SUM(TimeSpan) From TimeSum where Address = 'xxxx' AND lineDate BETWEEN '2009-12-04' AND '2009-12-06'
    但是如果时间跨度为 '2009-12-14' 到 '2009-12-16' 时候这样写就会产生问题只能合计到 14,15号2天的值,
    但是如果改为如下代码:
     daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("b", DbType.Date));
                    daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("c", DbType.Date));
      daSpan.SelectCommand.Parameters[1].Value = startDate.Date;
                    daSpan.SelectCommand.Parameters[2].Value = endDate.Date;
    就计算正确,但是如果这样写 的话当时间为 '2009-12-4' 到 '2009-12-6'时候就合计不正确 有没有遇到的阿,请给解释一下阿。
    我觉得不应该啊。



    2009年12月17日 3:59

答案

全部回复

  • 如果那列是日期格式的 传参的时候设置参数值直接为DateTime类型就可以了没必要转换成字符串类型的

    sqlTime = "select SUM(onlineTimeSpan) From T_OnlineTimeSum where ipAddress = :a AND onlineDate BETWEEN :b AND :c";
                    daSpan = new SQLiteDataAdapter(sqlTime, conn);
                    daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("a", DbType.String));
                    daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("b", DbType.Date));
                    daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("c", DbType.Date));

                    daSpan.SelectCommand.Parameters[0].Value = Address;
                    daSpan.SelectCommand.Parameters[1].Value = startDate.Date;
                    daSpan.SelectCommand.Parameters[2].Value = endDate.Date;


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    2009年12月17日 4:49
    版主
  • 首先你的数据库中存放的日期字段是什么格式的?
    数据库中存放的日期带时间(2008-06-15 03:35:28)了吗?

    你用字符串比较和直接用日期比较可能有区别,比较时先把日期格式化下

    http://www.cppblog.com/sleepwom/archive/2008/12/05/68613.html
    努力+方法=成功
    2009年12月17日 4:50
  • 是Date类型的,是因为在合计2009-12-4 ~ 2009-12-6 的数据不正确才转化的。
    2009年12月17日 5:03
  • 我想到了一个问题  我传入的时间 是从画面上执行如下代码得到的
       DateTime startTime = new DateTime();
      startTime = Convert.ToDateTime(txtstartTime.Text);
    画面上是一个textBox 然后我在判断它符合日期格式后 进行转换的,不知道这样做 会不会产生影响。
    2009年12月17日 5:13
  • 我又测试了 一下使用如下代码:
    sqlTime = "select SUM(onlineTimeSpan) From T_OnlineTimeSum where ipAddress = :a AND onlineDate BETWEEN :b AND :c";
                    daSpan = new SQLiteDataAdapter(sqlTime, conn);
                    daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("a", DbType.String));
                    daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("b", DbType.Date));
                    daSpan.SelectCommand.Parameters.Add(new SQLiteParameter("c", DbType.Date));

                    daSpan.SelectCommand.Parameters[0].Value = Address;
                    daSpan.SelectCommand.Parameters[1].Value = startDate.Date;
                    daSpan.SelectCommand.Parameters[2].Value = endDate.Date;
    发现当时间 2009-12-2~2009-12-5 的时候合计结果错误
    如果测试时间为 2009-12-12~2009-12-15 的时候合计结果正确。
    请问 谁知道为什么啊。

    2009年12月17日 7:24
  •  用string类型的参数,结果应该是正确的。between 2009-12-14 to 2009-12-16 应该就是24小时,也就是2天的时间呀。
    为了减少误会,你干脆加上时间 YYYY-MM-DD HH:MM:SS
    参照这个文档
    http://www.sqlite.org/lang_datefunc.html


    Mog Liang
    • 已建议为答案 Mog Liang 2009年12月24日 3:49
    • 已标记为答案 Mog Liang 2009年12月25日 5:35
    2009年12月21日 10:27