新手求助!!!VS2008设置时间段访问数据库,如何把首尾时间点设置成变量,赋值后实现查询功能??

积硅步至千里. 2016-08-03 09:45:52
MFC新手,也是第一次接触SQL,用vs2008采取ODBC方式访问数据库。实现查询某时间段的数据,想把首位时间段设置成变量再select网上查了几种方法,都报错了,希望某位大神帮我解答一下,感谢
下面是源程序:
void CODBCDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码

m_time1.GetWindowText(c_time1);
m_time2.GetWindowText(c_time2);
UpdateData(TRUE);
switch (num_radio){
case 0: List_All(L"select * from score order by id");
break;
case 1: List_All(L"select * from score order by name");
break;

case 2: List_All(L"select * from score where (data>=c_time1) and (data<=c_time2)");/////??

break;
default: break;
}
}
简单说一下:做了两个日历控件,并把选择的日期显示在编辑框中,为编辑框绑定变量。在获得编辑框内容分别赋给c_time1,c_time2,他们定义为CString类型。编译通过了,但是有提示选择按日期查询时:

百度了说字段不能设置为非空,可是我设置允许空啊

...全文
302 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[quote=引用 10 楼 SXJIAKE 的回复:] 可以把 SQL 打出来看看: AfxMessageBox((LPCTSTR)szSQL); List_All((LPCTSTR)szSQL); 或者你自己先写死一条正确的查询语句查询看看,看看查询语句是否正确。 其实现在问题已经解决的差不多了,就是说你的 SQL 语句有问题而已,查验一下就行了。[/quoteke 可以了。谢谢。把yyyy-mm-dd去掉就可以了
「已注销」 2016-08-05
  • 打赏
  • 举报
回复
可以把 SQL 打出来看看: AfxMessageBox((LPCTSTR)szSQL); List_All((LPCTSTR)szSQL); 或者你自己先写死一条正确的查询语句查询看看,看看查询语句是否正确。 其实现在问题已经解决的差不多了,就是说你的 SQL 语句有问题而已,查验一下就行了。
「已注销」 2016-08-04
  • 打赏
  • 举报
回复
改成双引号试试
void CODBCDlg::OnBnClickedButton5()
{
    CTime tm1;
    CTime tm2;
    CString sqlStr;
 
    m_time1.GetCurSel(tm1);
    m_time2.GetCurSel(tm2);
    c_time1 = tm1.Format(_T("%Y-%m-%d"));
    c_time2 = tm2.Format(_T("%Y-%m-%d"));
    UpdateData(TRUE);
    switch (num_radio){
    case 0:
        List_All(_T("select * from score order by id"));
        break;
    case 1:
        List_All(_T("select * from score order by name"));
        break;
    case 2:
        sqlStr.Format(_T("select * from table where rq between to_date(\"%s\",\"yyyy-mm-dd\") and to_date(\"%s\",\"yyyy-mm-dd\")"), (LPCTSTR)c_time1, (LPCTSTR)c_time2);
        List_All((LPCTSTR)sqlStr);
        break;
    default:
        break;
    }
}
  • 打赏
  • 举报
回复
引用 4 楼 SXJIAKE 的回复:
void CODBCDlg::OnBnClickedButton5()
{
	CTime tm1;
	CTime tm2;
	CString sqlStr;

	m_time1.GetCurSel(tm1);
	m_time2.GetCurSel(tm2);
	c_time1 = tm1.Format(_T("%Y-%m-%d"));
	c_time2 = tm2.Format(_T("%Y-%m-%d"));
	UpdateData(TRUE);
	switch (num_radio){
	case 0:
		List_All(_T("select * from score order by id"));
		break;
	case 1:
		List_All(_T("select * from score order by name"));
		break;
	case 2:
		sqlStr.Format(_T("select * from table where rq between to_date('%s','yyyy-mm-dd') and to_date('%s','yyyy-mm-dd')"), (LPCTSTR)c_time1, (LPCTSTR)c_time2);
		List_All((LPCTSTR)sqlStr);
		break;
	default:
		break;
	}
}
to_data有提示不可识别的内置函数,就删除了
  • 打赏
  • 举报
回复
引用 4 楼 SXJIAKE 的回复:
void CODBCDlg::OnBnClickedButton5()
{
CTime tm1;
CTime tm2;
CString sqlStr;

m_time1.GetCurSel(tm1);
m_time2.GetCurSel(tm2);
c_time1 = tm1.Format(_T("%Y-%m-%d"));
c_time2 = tm2.Format(_T("%Y-%m-%d"));
UpdateData(TRUE);
switch (num_radio){
case 0:
List_All(_T("select * from score order by id"));
break;
case 1:
List_All(_T("select * from score order by name"));
break;
case 2:
sqlStr.Format(_T("select * from table where rq between to_date('%s','yyyy-mm-dd') and to_date('%s','yyyy-mm-dd')"), (LPCTSTR)c_time1, (LPCTSTR)c_time2);
List_All((LPCTSTR)sqlStr);
break;
default:
break;
}
}


  • 打赏
  • 举报
回复
[quote=引用 2 楼 zgl7903 的回复:]
用了你的方法,c_time1.Format(_T("SELECT * FROM score WHERE data BETWEEN TO_DATE('%s', '%s') AND TO_DATE('%s', '%s')"),time1.Format(_T("%Y-%m-%d")), _T("YYYY-MM-DD"),time2.Format(_T("%Y-%m-%d")), _T("YYYY-MM-DD"),0);
c_time2.Format(_T("SELECT * FROM score WHERE data BETWEEN TO_DATE('%s', '%s') AND TO_DATE('%s', '%s')"),time1.Format(_T("%Y-%m-%d")), _T("YYYY-MM-DD"),time2.Format(_T("%Y-%m-%d")), _T("YYYY-MM-DD"),0);


UpdateData(TRUE);
switch (num_radio){
case 0: List_All(L"select * from score order by id");
break;
case 1: List_All(L"select * from score order by name");
break;

case 2: List_All(L" select * from score where data between TO_DATA('c_time1','yyyy-mm-dd') and TO_DATA('c_time2','yyyy-mm-dd') ");/////??

break;
default: break;
提示
「已注销」 2016-08-04
  • 打赏
  • 举报
回复
void CODBCDlg::OnBnClickedButton5()
{
	CTime tm1;
	CTime tm2;
	CString sqlStr;

	m_time1.GetCurSel(tm1);
	m_time2.GetCurSel(tm2);
	c_time1 = tm1.Format(_T("%Y-%m-%d"));
	c_time2 = tm2.Format(_T("%Y-%m-%d"));
	UpdateData(TRUE);
	switch (num_radio){
	case 0:
		List_All(_T("select * from score order by id"));
		break;
	case 1:
		List_All(_T("select * from score order by name"));
		break;
	case 2:
		sqlStr.Format(_T("select * from table where rq between to_date('%s','yyyy-mm-dd') and to_date('%s','yyyy-mm-dd')"), (LPCTSTR)c_time1, (LPCTSTR)c_time2);
		List_All((LPCTSTR)sqlStr);
		break;
	default:
		break;
	}
}
  • 打赏
  • 举报
回复
按你说的操作了,编译通过。但是点查询时,出现中断啊,什么情况啊
zgl7903 2016-08-04
  • 打赏
  • 举报
回复
得把变量构造成SQL语句 类似于 select * from table where rq between to_date('2009-09-01','yyyy-mm-dd') and to_date('2009-09-08','yyyy-mm-dd')

  CTime tm1(2015,10,1, 0, 0, 0);
  CTime tm2(2016,10,1, 0, 0, 0);

  CString szSQL;
  szSQL.Format(_T("SELECT * FROM score WHERE data BETWEEN TO_DATE('%s', '%s') AND TO_DATE('%s', '%s')"),
    tm1.Format(_T("%Y-%m-%d")), _T("YYYY-MM-DD"),
    tm2.Format(_T("%Y-%m-%d")), _T("YYYY-MM-DD"),
    0);

  TRACE(_T("%s\n"), szSQL);
  //SELECT * FROM score WHERE data BETWEEN TO_DATE('2015-10-01', 'YYYY-MM-DD') AND TO_DATE('2016-10-01', 'YYYY-MM-DD')

  • 打赏
  • 举报
回复
还是有错啊 也是醉了,兄弟,还有其他方法吗

void CODBCDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
//m_time1.GetCurSel(time1);
//m_time2.GetCurSel(time2);
m_time1.GetWindowText(c_time1);
m_time2.GetWindowText(c_time2);
c_time1 = time1.Format(_T("%Y-%m-%d"));
c_time2 = time2.Format(_T("%Y-%m-%d"));
CString szSQL;

//TRACE(_T("%s\n"), szSQL);
UpdateData(TRUE);
switch (num_radio){
case 0: List_All(L"select * from score order by id");
break;
case 1: List_All(L"select * from score order by name");
break;
//case 2:
//szSQL.Format(_T("SELECT * FROM score WHERE data BETWEEN TO_DATE('%s', '%s') AND TO_DATE('%s', '%s')"),
//c_time1.Format(_T("%Y-%m-%d")), _T("YYYY-MM-DD"),c_time2.Format(_T("%Y-%m-%d")), _T("YYYY-MM-DD"),0);

case 2: szSQL.Format(_T("select * from score where data between (\"%s\",\"yyyy-mm-dd\") and (\"%s\",\"yyyy-mm-dd\")"), (LPCTSTR)c_time1, (LPCTSTR)c_time2);
List_All((LPCTSTR)szSQL);

break;
default: break;
}
}
  • 打赏
  • 举报
回复
有木有大神啊,纠结了一天了没搞定

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧