我在写一个“通用数据库查询系统”时,需要用SQL对一个日期型字段进行查询,突然发现Delphi没有日期型变量,在Foxpro中一对大括号{}就表示这是个日期型变量,而在Delphi中我竟然不知道如何表示。羞愧之余,到处找资料、查信息。先是看到在Delphi FAQ中言之凿凿地说可以用:where aDate:=#01/01/99#或是 where aDate:=“01/01/99”来查找,赶紧试一下,报语法错;后又在Delphi Chat中看到一位朋友说可以用如下语句来查找:where aDate:=Cast(‘01/01/99’ as Date);又连忙试一下,哈,没有出错了,而且有返回的记录,哈哈哈……,还没笑完,眼睛随便瞟了一眼结果就笑不出来了,因为结果完全不对,查出的结果的日期全为0000-00-00,这是怎么回事?赶快查SQL语言的书,说Cast是用来进行类型转换的,如果类型转换不正确的话并不会提示出错,而是返回一个无效值。看来,我就是碰到了类型转换不正确。拍了半天脑袋,灵机一动,是不是日期类型的格式不对,查看了一下Delphi显示的数据库中的日期型字段,发现它的格式是1999-9-20,我用的SQL语句是:where aDate:=Cast(‘99-9-20’ as Date);应该不会错,可是它的返回结果如何解释呢?为什么别人都可以正确运行,而我就是不行呢?实在没办法了,抱着死马当活马治的心情,调出WIN98的控制面板中区域设置,选中“日期”页,将其日期分隔符由“-”改为“/”,然后再来试运行:select * from aDataBase where aDate:=Cast(‘09/20/99’ as Date);哈哈,出来结果了,而且完全正确,我简直笑得涕泪横流。闹了半天,原来只是一个小小的日期分隔符在做怪。
  通过进一步试验,发现不管系统的短日期格式设成怎样,SQL语句都必须写成where aDate:=Cast(‘09/20/99’ as Date),为什么呢?嘿嘿,我也不知道!