急!data字段的比较查询(200分)

  • 主题发起人 主题发起人 fgs
  • 开始时间 开始时间
F

fgs

Unregistered / Unconfirmed
GUEST, unregistred user!
如:对IBLocal:

select * from salary_history where change_date=93-9-8

总是查不到记录(相应记录确实存在)

又:
select * from salary_history where change_date>93-9-8

则列出所有记录。
请各位大侠指教。

 
把日期用'mm/dd/yyyy'的格式
select * from salary_history where change_date='09/08/1993'
 
日期格式要根据你的设置而定,先把你的SQL在database explore 中执行一下。
日期是要加引号的。
 
nickname的回答正确,系统默认是'mm-dd-yyyy',除非另外设置改变这规则
日期一定要加引号.
 
看看是否有时间的问题,比如数据库字段中可能是:"1993-9-8 13:00:00"
你查询等于 "1993-9-8" 的记录肯定是查不到的,将条件改为: ( change_date>"09/07/1993 23:59:59"
and change_date<="09/08/1993 13:59:59")
 
datetime类型是DOUBLE型,整数和小数都有特别的含义,
你那样的查询肯定出来错误结果拉,都转成date不行吗?
 
1:日期要加引号
2:93-9-8代表93/9/8 00:00:00
你要选择满足你的条件的记录只能
var
date1,date2:tdatetime;
...
date1:='93-9-8';
date2:='93-9-9';
...
sql.add('select * from salary_history where change_date>=:date1');
sql.add('and change_date<:date2');
...
 
这样对参数格式太死板,一般推荐采用QUERY参数方法
select * from yourTable where Datefield = :Date1
把QUERY的PARAMS中的DATE1的类型设置为DATETIME
程序中用:
var
d:TDate;
begin
//process your date
query1.params[0].asdate := d;
query1.open;
 
对不起,我的代码错了,应为
date1:=strtodatetime('93-9-8');
date2:=strtodatetime('93-9-9');

...
with query1 do
begin
...
sql.add('select * from salary_history where change_date>=:date1');
sql.add('and change_date<:date2');
...
end;
 
我在做SQL服务器的查询时,遇见过这样的问题。好象在SYBASE等之类的大型数据
库里的日期表现为字符,且系统默认日期格式为'mm/dd/yyyy',好象也不能改变。
换句话说,即使你改边系统日期格式来查询,结果还是不行。最好采用IBLocal的默认日期格式'mm/dd/yyyy'就OK了。

我在sybase是这样d
 
<pre><font size=3>
日期格式默认为mm/dd/yy,所以要输入必须采用:
select * from salary_history where change_date="09/08/93"
select * from salary_history where change_date>"09/08/93"
此格式可在控制面版中的BDE Administrator中(或是开始菜单)的
config=>system=>date中设定
其中FOURDIGITYEAR 是否以四位表示年份(默认为两位)
LEADINGZEROD 是否表示用两位表示日期,不足两位补0 (默认为false:一位)
LEADINGZEROM 是否表示用两位表示月份,不足两位补0 (默认为false:一位)
mode: 0表示mdy(即月日年),1表示DMY,2表示YMD
SEPARATOR:表示分隔符默认为/
YEARBIASED:是否在两位表示年份加1900,如果为TRUE时96表示为1996,否则表示为0096年
记住一定要加单引号或双引号将日期引上
具体说明见下:
Parameter Description
SEPARATOR Character used to separate the month, day, and year components of a date value; such as, the "/" in "12/31/96." The default is the character normally used in the country selected in the Windows Control Panel when any BDE application is installed.
MODE Controls the order of the month, day, and year components and can be 0 (for MDY), 1 (for DMY), or 2 (YMD). The default is the order normally used in the country selected in the Windows Control Panel when any BDE application is installed.
FOURDIGITYEAR Specifies the number of digits for the year value (four or two). If TRUE, years are expressed in four digits (such as, 1996). If FALSE, the default, years have two digits (96).
YEARBIASED Tells the BDE application whether or not it should add 1900 to years entered as two digits. For example, if TRUE and you enter "7/21/96," the BDE application interprets your value as "7/21/1996", otherwise, the date is interpreted as entered (in this case, "7/21/0096"). Default: TRUE
LEADINGZEROM Specifies whether or not single digit month values have a leading zero. For example, if you enter "1/1/80" and this is set to TRUE, the BDE application interprets the date as "01/1/80." If FALSE, the value is "1/1/80." Default: FALSE
LEADINGZEROD Controls whether or not single digit day values have a leading zero. For example, if you enter "1/1/80" and this is set to TRUE, the BDE application interprets the value as "1/01/80." If FALSE, your date is "1/1/80." Default: FALSE
</font></pre>
 
你可改用Extract将年月日分别提取出来进行比较,这在大多数SQL服务器上
均可得到支持。大富翁已有类似的解答了。
 
我在SQL SERVER 6.5中是这样做的:
select * from salary_history where change_date='1993-9-8'
select * from salary_history where change_date>'1993-9-8'

select * from salary_history where change_date='9-8-1993'
select * from salary_history where change_date>'9-8-1993'

select * from salary_history where change_date='9-8-93'
select * from salary_history where change_date>'9-8-93'
都可以实现查询。
 
fgs
到底急不急?这么多答案了,还没解决?
 
IBLocal:反正大家都有,用SQL EXPLORER试验,把fgs问题中的
select * from salary_history where change_date=93-9-8
复制到SQL EXPLORER中执行,没返回任何数据,但是也没报错!改成
select * from salary_history where change_date='9-8-93'
就可以了。再复制
select * from salary_history where change_date>93-9-8
报错,原来大于号是全角的,改一下就好.做到这里发现问题,fgs说得对!
语句执行没报错,所有的记录全部显示!不理解!日期不加引号也可以运行,不报错!
小于93-9-8的日期也显示!好奇怪哦.
 
在BDE Administrator中把日期格式改一下,系统默认是'mm-dd-yyyy',日期要加引号.
 
按BDE AdministratorBDE的日期格式,自己按格式修改!
 
BDE只支持美国的日期格式。其格式为:mm/dd/yyyy(月/日/年)。将SQL 代 码 改 为:
select * from orders where saledate >'09/08/1993'
为了使查询和进行其它数据操作时的日期格式一致,建议在控制面板的区域设置项中将区域置为: 英语(美国)。

 
我同意hanson的意见,不过
我觉得数据库中如果是 datetime
转化为 date 应该就能比较了.
 
没有找到问题的症结 fgs是发现了不能理解的怪现象!
IBLocal:反正大家都有,用SQL EXPLORER试验一下,
select * from salary_history where change_date=93-9-8
复制到SQL EXPLORER中执行,没返回任何数据,但是也没报错!改成
select * from salary_history where change_date>93-9-8
做到这里发现问题,fgs说得对!语句执行没报错,所有的记录全部显示!不理解!日期
不加引号也可以运行,不报错!
不知道SQL EXPLORER把=或>号后面的数据解释成何种数据类型.
fgs我说的是不是你的本意?
 
后退
顶部