数据库中用于保存日期时间的字段,是否应该用 双精度型,就像Delphi一样。这样TDateTime直接可以赋值给该字段。最重要的是,可以大大提高查询效率。
比如要查找2006年3月到2007年5月之间的所有记录,如果用双精度型
条件就是 where (X > 38776.99999) and (X < 38869), 
如果是 日期时间型,就不是这么简单了吧本人没做过数据库,如果说得不对,不要打击偶。

解决方案 »

  1.   

    可以是可以的,但不通用。
    比如Ms Sql Server数据库,它和Delphi的起始日期规定的不一样,所以同一个双精度值,代表的不是同一天。所以我一般日期查询是用格式化后的日期字符串传进去,让它自己转化。
      

  2.   

    我一般日期查询的时候也是用格式化厚的日期字符串传进去,让他们自己转换,效率我感觉还是可以的!~
    同意一楼所说的,得到方便的同时,也会有不方便的地方!~
    打个比方:"where (X > 38776.99999) and (X < 38869), "这个WHERE语句是不是也需要转换?
      

  3.   

    where (X > 38776.99999) and (X < 38869) 这样书写是先知道了TDateTime的 2006-3-1的值是 38777,这个需要先转换,我主要重视的查询效率。
      

  4.   

    to: xxmmmx(踢踏)如果你总是用DELPHI来操作数据库,是否不需要考虑MS SQL的起始日期的规定?
      

  5.   

    对于MS SQL来说,那就是一个双精度型,与日期时间无关
      

  6.   

    to: deansroom(丁樵方玉) 我的意思是,对于SQL来说,我要查询的是数值,38869是一个数,不是日期时间。对数值的查询,一定远优于对日期时间的查询。把这个数当作日期时间是DELPHI的问题。
      

  7.   

    既然用来表示日期时间,当然跟起始的点有关系了,你可以自己试试:select convert(datetime,0)   ---->结果:1900-01-01 00:00:00.000
    DateTimePicker.DateTime:=0;  ---->结果:1899-12-30 00:00:00.000select convert(float,convert(Datetime,'2007-01-30'))  ---->结果:39110
    BitBtn1.Caption:=FloatToStr(oweBeginDate.Date);
    oweBeginDate.DateTime:=StrToDate('2007-01-30');       ---->结果:39112
      

  8.   

    也就是说你可以用双精度类型来作为日期时间查询的条件,但要处理MS Sql Server和Delphi之间用来表示日期时间的差异
      

  9.   

    如果我根本不使用 SQL的日期时间型,我为什么要考虑SQL与DELPHI的日期时间差异?
      

  10.   

    我要查询的是一个双精度字段,提交的表达式是一个数值范围。与SQL的日期时间应该没有任何关系了吧。
      

  11.   

    确实可以当作纯粹的双精度数值来处理,这是毫无疑问的。
    但一楼说的不方便就来了:如何处理Sql语句内部的日期转换?
    假设我做2007年一月份的月结,时间从20070101~20070131,如果按日期类型来处理,我只要传一个参数200701就可以了,现在就要传三个参数了,分别是200701,双精度数1(开始日期),双精度数2(结束日期)。
    这样理解对否?
      

  12.   

    如果是双精度数的话.就不会是200701了,应该就会是"39110"只是大致的这样表示,TO:xxmmmx(踢踏) ( )
    我跟你的思路是一样的,想法都是一样的就是你说的时候不应该说200701
      

  13.   

    可以用字符串, "YYYYMMDDHHMMSS"格式表示
    比如要查找2006年3月到2007年5月之间的所有记录,如果用字符串
    条件就是 where (X > "20060301000000") and (X < "20070531235959"), 
      

  14.   

    我在数据库设计时遵循的原则:(SQLServer)
    一切以后台为准,而不是开发工具日期时间字段使用 datetime 
    日期字段使用 int
    时间字段 float
    月份字段 varchar
    永远不要用字符串类型作为日期时间字段的类型记得在 Delphi 中转换 SQLServer 中的 int 表示的日期,具体就是 delphi.TDateTime + 2根本不用担心查询时 SQLServer 转换 字符串为日期时间 类型时的效率的问题,因为
    SQLServer 会在优化之前就转换好,这个时间根本不会影响查询时的效率
      

  15.   

    日期字段如果在数据库是Date或DateTime类型的话,用日期字段做为WHERE条件时SQL文中必须进行类型转换会比较复杂,取数据时月和日2位显示又需要格式化,操作不比字符串少多少
    而且如果只要时间的话,只能使用DateTime字段,然后格式化输出不显示日期部分,造成数据冗余
      

  16.   

    mssql本来底层也是这样处理的,而且,时间字段上有索引,查询效率没有区别
      

  17.   

    我觉得你们在这么一个简单的问题纠缠,简直莫名其妙用 float 类型表示时间,用 convert() 进行转换,方便之极,转成字符串也行convert(datetime,rFloat)
    convert(varchar,convert(datetime,rFloat)),120)怎么转换都行啊。和delphi结合的只存在 +(-)2 的问题用 varchar 字符串来表示日期或者时间,愚蠢!
      

  18.   

    无话可讲了,我终于明白,微软的工程师都是吃干饭的,应该向csdn的兄弟们学习
      

  19.   

    如果字段是双精度型,传入的查询参数当然是双精度型的。SQL不会涉及日期时间转换。转换是在DELPHI代码里实现。