Oracle数据库迁移碰到的有关问题
Oracle数据库迁移碰到的问题
数据库迁移碰到的问题:这段SQL表示搜索日期早于to_date的内容
query=query+ " and {createdate}<=to_date('"+timeend+" 23:59:59','YYYY-MM-DD HH24:mi:ss')";
page.setQueryString(query);
to_date()是Oracle特有的函数,用来转换时间格式,在系统设计的时候,‘timeend’是传递过来的字符串类型的值
现在想要改成不同数据库都支持的话,必须把to_date()给替换掉,同时又不影响整个SQL语句表达的最后结果!
我尝试使用API中的Date类或者其他的类,似乎都不能解决问题,createdate的类型是Date,to_date起到的作用就是把字符串转化为日期。
比如用户选择的日期是2007-8-8,最后转化后还是2007-8-8,所以使用
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd");
d = sdf.parse(bYmd); 等方法是不能成功的。
最后有种解决方法是,另外写个类,写个方法判断数据库的类型,把to_date再封装次,如果是Oracle就不to_date当做字符串传递过去,如果不是则使用对应各种数据库可以转化日期的方法。
比如
String sql=query+ " and {createdate}<=to_date('"+timeend+" 23:59:59','YYYY-MM-DD HH24:mi:ss')";
B.getSql(sql);
如果判断是Oracle,则sql不变,如果不是,则修改to_date为对应数据库的方法。
有种最简单的方法就是把数据库字段类型改了去 ,可惜经理可能会不同意。
不知道上面方法的可行性怎么样..还有没有更好的方法。
前面我说过我尝试过把string转成 date ,使用DateFormat.parse()可以把字符串类型格式化成
Date类型,但是结果是类似Wed Aug 08 00:00:00 CST 2007这种数据,如果存储这种数据的话,恐怕没人会接受,public static boolean strToDate(String bYmd) throws ParseException
{
java.util.Date d = null;
boolean e=false;
try {
if (bYmd == null || bYmd.trim().length() == 0) {
return e ;
} else {
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd");
d = sdf.parse(bYmd);
System.out.println("日期1="+d);
}
} catch (Exception e1) {
}
return e;
}
public static void main(String[] args) throws ParseException {
// TODO Auto-generat ed method stub
strToDate("2007-8-8");}
只是希望有更好的办法,没有就结贴了..
前面我说过我尝试过把string转成 date ,使用DateFormat.parse()可以把字符串类型格式化成
Date类型,但是结果是类似Wed Aug 08 00:00:00 CST 2007这种数据,如果存储这种数据的话,恐怕没人会接受
你怎么还不明白呢
date 就是date 没有什么这那的date类型 你看到的那个结果是因为你对这个date进行了 format
数据库迁移碰到的问题:这段SQL表示搜索日期早于to_date的内容
query=query+ " and {createdate}<=to_date('"+timeend+" 23:59:59','YYYY-MM-DD HH24:mi:ss')";
page.setQueryString(query);
to_date()是Oracle特有的函数,用来转换时间格式,在系统设计的时候,‘timeend’是传递过来的字符串类型的值
现在想要改成不同数据库都支持的话,必须把to_date()给替换掉,同时又不影响整个SQL语句表达的最后结果!
我尝试使用API中的Date类或者其他的类,似乎都不能解决问题,createdate的类型是Date,to_date起到的作用就是把字符串转化为日期。
比如用户选择的日期是2007-8-8,最后转化后还是2007-8-8,所以使用
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd");
d = sdf.parse(bYmd); 等方法是不能成功的。
最后有种解决方法是,另外写个类,写个方法判断数据库的类型,把to_date再封装次,如果是Oracle就不to_date当做字符串传递过去,如果不是则使用对应各种数据库可以转化日期的方法。
比如
String sql=query+ " and {createdate}<=to_date('"+timeend+" 23:59:59','YYYY-MM-DD HH24:mi:ss')";
B.getSql(sql);
如果判断是Oracle,则sql不变,如果不是,则修改to_date为对应数据库的方法。
有种最简单的方法就是把数据库字段类型改了去 ,可惜经理可能会不同意。
不知道上面方法的可行性怎么样..还有没有更好的方法。
- [list=]
1 楼
ddandyy
2007-06-14
你直接做一个 java.sql.date 的类型放进去会报错么
2 楼
yollywu
2007-06-14
直接做一个 java.sql.date 的类型放进去会报错么
你是指替换掉timeend还是替换掉整个(to_date('"+timeend+" 23:59:59','YYYY-MM-DD HH24:mi:ss')";
)?timeend是页面传递过来的参数,页面那里是通过一个JS日期选择框
用户选择的日期是2007-8-8,最后转化后还是2007-8-8,这是最种在数据库存在的形式
你是指替换掉timeend还是替换掉整个(to_date('"+timeend+" 23:59:59','YYYY-MM-DD HH24:mi:ss')";
)?timeend是页面传递过来的参数,页面那里是通过一个JS日期选择框
用户选择的日期是2007-8-8,最后转化后还是2007-8-8,这是最种在数据库存在的形式
3 楼
ddandyy
2007-06-14
很奇怪 在数据库中存在的形式明明是date吧 你为什么要强调他是xxxx-xx-xx形式呢 那只是你用工具查看的时候工具自动format的结果吧
用户输入的是string xxxx-xx-xx 然后你在sql里通过 to_date() 把他变成了date 放在数据库里
我的意思是 你在代码里就把这个string转成 date 然后 在sql里就不 to_date 了 直接放进去 试试
我们这不用date类型的字段 所以没试过 不知道会不会报错
用户输入的是string xxxx-xx-xx 然后你在sql里通过 to_date() 把他变成了date 放在数据库里
我的意思是 你在代码里就把这个string转成 date 然后 在sql里就不 to_date 了 直接放进去 试试
我们这不用date类型的字段 所以没试过 不知道会不会报错
4 楼
whistler
2007-06-15
在拼sql语句时日期用字符串,不用转成日期格式吧,我一直都是这么用的,如果预置参数的话必须日期格式
5 楼
yollywu
2007-06-15
引用
用户输入的是string xxxx-xx-xx 然后你在sql里通过 to_date() 把他变成了date 放在数据库里
我的意思是 你在代码里就把这个string转成 date 然后 在sql里就不 to_date 了 直接放进去 试试
我的意思是 你在代码里就把这个string转成 date 然后 在sql里就不 to_date 了 直接放进去 试试
前面我说过我尝试过把string转成 date ,使用DateFormat.parse()可以把字符串类型格式化成
Date类型,但是结果是类似Wed Aug 08 00:00:00 CST 2007这种数据,如果存储这种数据的话,恐怕没人会接受,public static boolean strToDate(String bYmd) throws ParseException
{
java.util.Date d = null;
boolean e=false;
try {
if (bYmd == null || bYmd.trim().length() == 0) {
return e ;
} else {
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd");
d = sdf.parse(bYmd);
System.out.println("日期1="+d);
}
} catch (Exception e1) {
}
return e;
}
public static void main(String[] args) throws ParseException {
// TODO Auto-generat ed method stub
strToDate("2007-8-8");}
只是希望有更好的办法,没有就结贴了..
6 楼
seacat
2007-06-21
理想的做法是用PreparedStatement,sql语句中使用占位符:"..and create_date<?"
然后setDate()传递java.sql.Date类型的参数
不过看你代码里面是直接传递拼装好的sql作为参数,恐怕就有点麻烦
然后setDate()传递java.sql.Date类型的参数
不过看你代码里面是直接传递拼装好的sql作为参数,恐怕就有点麻烦
7 楼
ddandyy
2007-06-21
前面我说过我尝试过把string转成 date ,使用DateFormat.parse()可以把字符串类型格式化成
Date类型,但是结果是类似Wed Aug 08 00:00:00 CST 2007这种数据,如果存储这种数据的话,恐怕没人会接受
你怎么还不明白呢
date 就是date 没有什么这那的date类型 你看到的那个结果是因为你对这个date进行了 format
8 楼
yollywu
2007-06-23
你怎么还不明白呢
date 就是date 没有什么这那的date类型 你看到的那个结果是因为你对这个date进行了 format
大哥,我知道那个结果是format的结果,你format一个那样的结果试下,我是说我尝试过没format的出来.
date 就是date 没有什么这那的date类型 你看到的那个结果是因为你对这个date进行了 format
大哥,我知道那个结果是format的结果,你format一个那样的结果试下,我是说我尝试过没format的出来.
9 楼
yiqingfeng
2007-06-23
传Timestamp进去
10 楼
galaxystar
2007-06-23
用ibatis可以很轻松搞定这条sql
11 楼
earlyup
2007-07-23
楼上的同志,用hibernate能顺利搞定这问题吗,我用的hibernate,不知道该怎么解决这问题。
12 楼
chenkan2000
2007-07-25
用HQL的cast(... as ...)表达式试一试。