弱智问题送分,怎样写日期查询的sql语句(50分)

  • 主题发起人 主题发起人 ziyu
  • 开始时间 开始时间
Z

ziyu

Unregistered / Unconfirmed
GUEST, unregistred user!
如何写日期查询的sql语句,我用select * from table_1 where datefield1>=:xx1 and datefield1<=:xx2 (xx1,xx2是变量)不能通过。另外,我想让用户随便输一个月份,就把这个月份的记录select出来。但2月与其他月的天数不同,难道又要写一个闰年计算程序吗?我可不想那么写那么繁琐,有没有其他简单的办法?
 
1.params[0].asdate:=
2.
查询》=本月01号 小于下一个月01 号即可
注意12月时应小于下一年01月01号
 
不用date类型,用int不行么?
两个combobox,一个选年,一个选月,
select *
from table
where nf=: and yf=:
 
Select *
From TableName
Where Convert(Char(10), FieldName, 111)='2000/04/15'

Select *
From TableName
Where Convert(Char(7), FieldName, 111)='2000/02'

Select *
From TableName
Where DatePart(y, FieldName)=2000 and DatePart(m, FieldName)=2

 
select * from table_1 where datefield1 between :xx1 and :xx2
 
将月份截出判断
或用 LIKE
 
1.parambyname('xx1').value:=.. ....
2.最简单是在建表时定义一个月份字段
 
年份和月份各建立个字段
 
在界面上要防止用户输入错误的日期,最好的方法就是用日期控件,如
D5的TDataTimePiker。D4中没有这个控件,但也有好多类似的第三方控件。
用这些东东用户就如同翻日历一样,绝不会翻出一个不存在的日期。
 
你的SQL语句没有毛病,估计是因为参数xx1和xx2的类型不对
才出错,应为TDateTime.至于是不是2月,和其他月份有什么
不同吗?

程序如下:(我是用C++Builder的,不过,注释得这么详细应该能读懂吧)

// 假设用户在Edit1,Edit2中分别输入年,月
// 年一定要为4位数 如: 2000年2月
AnsiString Mon_Left,Mon_Right;
Mon_Left = Edit1->Text+"-"+Edit2->Text+"-1"; //此时,Mon_Left="2000-2-1"
if(StrToInt(Edit2->Text)==12) //此时,Mon_Right="2000-3-1" ,考虑12月的问题
Mon_Right = IntToStr(StrToInt(Edit1->Text)+1)+"-1-1";
else
Mon_Right = Edit1->Text+"-"+IntToStr(StrToInt(Edit2->Text)+1)+"-1";

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("select * from table_1 where datefield1>=:xx1 and datefield1<:xx2");
Query1->ParamByName("xx1")->AsDateTime = Mon_Left;
Query1->ParamByName("xx2")->AsDateTime = Mon_Right;
Query1->Prepare();
Query1->ExecSQL();
Query1->Active = true;
 
params[0].asdatetime这些给参数赋值的语句,我都写了,不需要大家提醒,我还不至于那么菜。
sw:我的思想和你的差不多,关键问题出在select * from table_1 where datefield1>=:xx1 and datefield1<:xx2这一句,不知是何原因。我用的是D3(古董吧!)是不是D3的问题呢?
 
拖两个TDATETIMEPICKER,表时间范围。DATETIMEPICKER1,DATETIMEPICKER2
SQL如此曰:'select * from table where (time>="'+DATETIMEPICKER1.datetime+'")and(time<="'+DATETIMEPICKER.datetime+'")'
sQL other writing:
'select * from table where
(time>='+formatdatatime('dddddd',DATETIMEPICKER1.date)+')and
(time<='+formatdatatime('dddddd',DATETIMEPICKER2.date)+')'
I see I right!
 
怎么?问题还没解决?

<<关键问题出在select * from table_1 where datefield1>=:xx1 and datefield1<:xx2这一句,不知是何原因。

或许是数据库类型的原因,应该说是SQL语言规范不一样,比如:
用Access数据库时是这样:
select * from table_1 where datefield1>=#2/1/2000# and datefield1<#3/1/2000#
而用MS SQL SERVER时是这样:
select * from table_1 where datefield1>='2/1/2000' and datefield1<'3/1/2000'
用#和'有时就是不一样.

Delphi3是老一点,但似乎不应该是她的事.

先试一试,不行再问!
 
select * from table_1 where datefield>=('''+xx1+''') and datefield<=('''+xx2+''');
至于月份,like ?
 
多人接受答案了。
 
后退
顶部