在Delphi下最小日期时间其实是个Double类型,为0时表示:1899-12-30,小于这个时间时为负数
delphi下日期分为year、month、day三个段,必须按照month(1-12),day(1-28\29\30\31,平年二月28天,闰年二月29天,大月31天,小月30天)
如果来一个1093-00-17,在delphi下是不合法的时间,但是MySQL下是合法的,mysql(5.5)所支持的日期时间类型有:DATETIME、 TIMESTAMP、DATE、TIME、YEAR。
日期时间类型 | 占用空间 | 日期格式 | 最小值 | 最大值 | 零值表示 |
DATETIME | 8 bytes | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 bytes | YYYY-MM-DD HH:MM:SS | 19700101080001 | 2038 年的某个时刻 | 00000000000000 |
DATE | 4 bytes | YYYY-MM-DD | 1000-01-01 | 9999-12-31 | 0000-00-00 |
TIME | 3 bytes | HH:MM:SS | -838:59:59 | 838:59:59 | 00:00:00 |
YEAR | 1 bytes | YYYY | 1901 | 2155 | 0000 |
因为MySQL中日期的year、month、day字段是可以为0的,所以1093-00-17这样的日期也可以合法保存的,但到了delphi里就麻烦了,EncodeDate(y,m,d)时直接报错了
解决方法:
在MySQL下提前将date字段转为字符串:DATE_FORMAT(date_field, '%Y-%m-%d')
在SQLServer下提前将date字段转为字符串:CONVERT(VARCHAR(8), date_field, 23),SQLServer日期转换参考
在Oracle下提前将date字段转为字符串:TO_CHAR(date_field,'yyyy-mm-dd' )