难题--到现在还没有人能解决(50分)

  • 主题发起人 主题发起人 esmartest
  • 开始时间 开始时间
E

esmartest

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi通过ADODataSet查询Access 数据库记录中一段时间内(如2006-9-1至2007-1-31)即将过生日的记录,*****注意:不是出生日期*****ADODataSet的CommandText中的语句如下:

select 卡号, 生日 from 会员信息 where (DateAdd('yyyy', DateDiff('yyyy', 生日, :Date1), 生日) between :Date1 and :Date2) or ( DateAdd('yyyy', DateDiff('yyyy', 生日, :Date2), 生日) between :Date1 and :Date2)

其中参数Date1、Date是运行时赋值分别为DateTimePicker1.Date和DateTimePicker2.Date但总是出错,提示"标准表达式中数据类型不匹配"

恳求高手解答,不胜感激!
 
Access中用sql语句时遇到时间要用#号括起来。
 
加上#也不行,问题并不在这里
 
请调试成功后在解答
 
怎么没有人回答,难道是问题难了吗?
 
测试数据:
卡号 生日
001 1978-1-26
002 1980-2-29
003 1979-8-11
 
如newsmile所说
我将参数Date1和Date2换成具体日期,仍然出现错误"标准表达式中数据类型不匹配"
select 卡号, 生日 from 会员信息 where (DateAdd('yyyy', DateDiff('yyyy', 生日, #2006-9-1#), 生日) between #2006-9-1# and #2007-1-31#) or ( DateAdd('yyyy', DateDiff('yyyy', 生日, #2007-1-31#), 生日) between #2006-9-1# and #2007-1-31#)
 
我用你说的数据在直接在access里面执行没有问题,是不是你在写sql.text时候引号出什么问题了
 
看我这个能否帮助你


adoq1.SQL.text:='select * from base where month(rq)>='+inttostr(monthof(d1))+' and month(rq)<='+inttostr(monthof(d2));
 
我记得delphi没有DateAdd, DateDiff这两个函数
这两个函数是在VB里面有
 
我记得delphi没有DateAdd, DateDiff这两个函数
这两个函数是在VB里面有


但是在ACCESS数据库中就要使用ACCESS所允许的函数
 
这就不晓得了,没试过哈
 
wp231957:你的语句不正确,因为你没有考虑年
 
hityou:我用的是delphi ADO组件中的ADODataSet在CommandText中写的语句,我又在Access 中试过了,问题依然存在,难道是我的Access版本问题,我用的Access XP
 
lqcros :DateAdd和DateDiff是Sql函数 Access中也可用,不是delphi函数,我是通过delphi 的ADODataSet控件访问Access的,语句是写在ADODataSet中的
 
问题还是没有解决,不过谢谢各位高手的解答,期待早写解决问题......
 
另外,我试过ADOQuery1.SQL.Text:='select 卡号, 生日 from 会员信息 where (DateAdd("yyyy", DateDiff("yyyy", 生日, #2006-9-1#), 生日) between #2006-9-1# and #2007-1-31#) or ( DateAdd("yyyy", DateDiff("yyyy", 生日, #2007-1-31#), 生日) between #2006-9-1# and #2007-1-31#)';仍然提示"标准表达式中数据类型不匹配"
 
我用的是2000,但是我直接查询的确有结果,我想你还是在引号上想想啊,你在执行的时候的,加个watch,查看sql.text,然后watch的value复知道access里面执行看看,就应该能找到问题.你可以直接放在access的查询里面看执行一下看看,
 
asp测试

<%
response.Write dateadd("yyyy", DateDiff("yyyy", "1978-1-26", "2006-9-1"), "1978-1-26")

%>

返回值为 2006-1-26
应该是对的哈


DateAdd 函数
返回已添加指定时间间隔的日期。

DateAdd(interval, number, date)

参数
interval

必选项。字符串表达式,表示要添加的时间间隔。有关数值,请参阅“设置”部分。

number

必选项。数值表达式,表示要添加的时间间隔的个数。数值表达式可以是正数(得到未来的日期)或负数(得到过去的日期)。

date

必选项。Variant 或要添加 interval 的表示日期的文字。

设置
interval 参数可以有以下值:

设置 描述
yyyy 年
q 季度
m 月
y 一年的日数
d 日
w 一周的日数
ww 周
h 小时
n 分钟
s 秒


说明
可用 DateAdd 函数从日期中添加或减去指定时间间隔。例如可以使用 DateAdd 从当天算起 30 天以后的日期或从现在算起 45 分钟以后的时间。要向 date 添加以“日”为单位的时间间隔,可以使用“一年的日数”(“y”)、“日”(“d”)或“一周的日数”(“w”)。

DateAdd 函数不会返回无效日期。如下示例将 95 年 1 月 31 日加上一个月:

NewDate = DateAdd("m", 1, "31-Jan-95")
在这个示例中,DateAdd 返回 95 年 2 月 28 日,而不是 95 年 2 月 31 日。如果 date 为 96 年 1 月 31 日,则返回 96 年 2 月 29 日,这是因为 1996 是闰年。

如果计算的日期是在公元 100 年之前,则会产生错误。

如果 number 不是 Long 型值,则在计算前四舍五入为最接近的整数。


DateDiff 函数
返回两个日期之间的时间间隔。

DateDiff(interval, date1, date2 [,firstdayofweek[, firstweekofyear]])

DateDiff 函数的语法有以下参数:

参数
interval

必选项。String expression 表示用于计算 date1 和 date2 之间的时间间隔。有关数值,请参阅“设置”部分。

date1, date2

必选项。日期表达式。用于计算的两个日期。

Firstdayofweek

可选项。指定星期中第一天的常数。如果没有指定,则默认为星期日。有关数值,请参阅“设置”部分。

Firstweekofyear

可选项。指定一年中第一周的常数。如果没有指定,则默认为 1 月 1 日所在的星期。有关数值,请参阅“设置”部分。

设置
interval 参数可以有以下值:

设置 描述
yyyy 年
q 季度
n 月
y 一年的日数
d 日
w 一周的日数
ww 周
h 小时
m 分钟
s 秒


firstdayofweek 参数可以有以下值:

常数 值 描述
vbUseSystem 0 使用区域语言支持 (NLS) API 设置。
vbSunday 1 星期日(默认)
vbMonday 2 星期一
vbTuesday 3 星期二
vbWednesday 4 星期三
vbThursday 5 星期四
vbFriday 6 星期五
vbSaturday 7 星期六


firstweekofyear 参数可以有以下值:

常数 值 描述
vbUseSystem 0 使用区域语言支持 (NLS) API 设置。
vbFirstJan1 1 由 1 月 1 日所在的星期开始(默认)。
vbFirstFourDays 2 由在新年中至少有四天的第一周开始。
vbFirstFullWeek 3 由在新的一年中第一个完整的周开始。


说明
DateDiff 函数用于判断在两个日期之间存在的指定时间间隔的数目。例如可以使用 DateDiff 计算两个日期相差的天数,或者当天到当年最后一天之间的星期数。

要计算 date1 和 date2 相差的天数,可以使用“一年的日数”(“y”)或“日”(“d”)。当 interval 为“一周的日数”(“w”)时,DateDiff 返回两个日期之间的星期数。如果 date1 是星期一,则 DateDiff 计算到 date2 之前星期一的数目。此结果包含 date2 而不包含 date1。如果 interval 是“周”(“ww”),则 DateDiff 函数返回日历表中两个日期之间的星期数。函数计算 date1 和 date2 之间星期日的数目。如果 date2 是星期日,DateDiff 将计算 date2,但即使 date1 是星期日,也不会计算 date1。

如果 date1 晚于 date2,则 DateDiff 函数返回负数。

firstdayofweek 参数会对使用“w”和“ww”间隔符号的计算产生影响。

如果 date1 或 date2 是日期文字,则指定的年度会成为日期的固定部分。但是如果 date1 或 date2 被包括在引号 (" ") 中并且省略年份,则在代码中每次计算 date1 或 date2 表达式时,将插入当前年份。这样就可以编写适用于不同年份的程序代码。

在 interval 为“年”(“yyyy”)时,比较 12 月 31 日和来年的 1 月 1 日,虽然实际上只相差一天,DateDiff 返回 1 表示相差一个年份。

下面的示例利用 DateDiff 函数显示今天与给定日期之间间隔天数:

Function DiffADate(theDate)
DiffADate = "从当天开始的天数:" & DateDiff("d", Now, theDate)
End Function
 
我照你的字段新建了一个数据库
下面这一段我测试了一下正常的
只是把: "yyyy" 改成了 'yyyy'

这里的年月日的排列一定要是 "年-月-日"
因为delphi里有时会用 "月/日/年"来表示日期

select 卡号, 生日 from mytable where (DateAdd('yyyy', DateDiff('yyyy', 生日, #2006-9-1#), 生日) between #2006-9-1# and #2007-1-31#) or ( DateAdd('yyyy', DateDiff('yyyy', 生日, #2007-1-31#), 生日) between #2006-9-1# and #2007-1-31#)
 
后退
顶部