读书人

有关数据库查询的有关问题

发布时间: 2012-03-13 11:21:12 作者: rapoo

有关数据库查询的问题
我现在碰到个奇怪的问题,没有得到解决:当我的月份或者日份是个位数时就查不到结果,否则就可以查到。我存储及查询时的时间格式也都是一样的,所以不明所以了。程序示例如下:

C/C++ code
TDateTimePicker *dtpODate;TDateTimePicker *dtpIDate;AnsiString table_name, date_time;AnsiString buf1 = dtpODate->Time.DateString();AnsiString buf2 = dtpIDate->Time.DateString();char *sqlbuf = new char(512);//此处到底是该用字符串还是数组定义的好呢?呵呵我目前是选择数组了...sprintf(sqlbuf,"Select * from table_name.c_str() where date_time.c_str() between '%s' and '%s'",\    buf1.c_str(), buf2.c_str()); ///////Test:eg1: buf1 = "2011-8-19", buf2 = "2011-10-7". result1: No elements found. ------------------------------------------ eg2: buf1 = "2011-10-19", buf2 = "2011-10-12". result1: Can find the special data. 

在数据库版本问了下,有大牛说我应该对其进行各转换,回复如下:
'2011-08-19' and '2011-10-07'.
这样的格式才对 不是的话需要转换
convert(varchar(10),cast('2011-8-19' as datetime),120)
//我查了下帮助,好像CB里面调用这个函数需要什么VCL头文件,可惜还是没找到,望各位大牛给予提示,3Q。


[解决办法]
这个转换要在sql语句中,不需要vcl文件的
[解决办法]
C/C++ code
sprintf(sqlbuf,"Select * from table_name.c_str() where date_time.c_str() between convert(varchar(10),cast('%s' as datetime),120) and convert(varchar(10),cast('%s' as datetime),120)",    buf1.c_str(), buf2.c_str());
[解决办法]
这个转换要在sql语句中,不需要vcl文件的
[解决办法]
这个转换要在sql语句中,不需要vcl文件的
[解决办法]
【char *sqlbuf = new char(512);//此处到底是该用字符串还是数组定义的好呢?呵呵我目前是选择数组了...】用 String就可以了!;
查询没结果,如果数据是有的,那看下你的库里是否date_time列类型没设成datetime而是字符串啊;
你的数据库是sqlserver还是oracle,时间格式的查询时不一样的
[解决办法]
TDateTimePicker这个控件得到的日期格式其实是跟你的系统设置的长短日期格式是一致的。从这个控件入手解决你的问题似乎不好,你应该考虑各种环境才对。应该重新格式化时间串。还有你上面提到的convert(varchar(10),cast('2011-8-19' as datetime),120)
这个函数是sql的函数,不涉及vcl等
探讨
我找了TDateTimePicker这个控件的属性,挨个试了下,怎么着也不能直接把日期2011-1-4显示为2011-01-04,只能自己重新读取字符串,然后手工设置,请问我如果直接更改控件属性的话,该怎么弄呢?谢谢了。。。

[解决办法]
环境设置,通过设置操作系统的短时间格式解决,如果不想更改时间格式,在程序启动时加入以下两句:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ShortDateFormat = "YYYY-MM-DD";
DateSeparator = '-';
}
[解决办法]
使用FormatDateTime转换
例:
String s=FormatDateTime("yyyy-MM-dd hh:mm:ss",Now());

读书人网 >C++ Builder

热点推荐