sybase中datetime显示和识别的问题

前2天有同事问我时间格式无法识别的问题,其实对时间为什么显示和识别 '七月 3 2007 9:34AM' 还是 'May 3 2007 15:12:00' 我一直很模糊,这次被问到后还真有点发闷,于是仔细研究了一下,终于搞明白了。
整理了一下测试结果,以备后用。[@more@]


1.首先我创建了2个用户 chinese 和 englisth 默认语言分别是 chinese 和 englisth。

sp_addlogin 'chinese', 'password', @defdb='adj', @deflanguage='chinese', @auth_mech = 'ASE'
go
sp_locklogin 'chinese', 'unlock'
go
sp_role 'grant ', 'sa_role', 'chinese'
go

sp_addlogin 'englisth', 'password', @defdb='adj', @deflanguage='us_english', @auth_mech = 'ASE'
go
sp_locklogin 'englisth', 'unlock'
go
sp_role 'grant ', 'sa_role', 'englisth'
go

2.准备工作 建测试表

create table test(id int,tt datetime)
go

3.用chinese用户连接
(1) 本地设置 locale = default, chinese, eucgb

--------------------------------------------------------------------------------------------
1> select getdate()
2> go
--------------------------
七月 3 2007 9:34AM
(1 row affected)
1> insert into test values(1,'七月 3 2007 9:34AM')
2> go
(1 row affected)
1> insert into test values(1,'七月 3 2007 15:12:00')
2> go
(1 row affected)
1> insert into test values(1,'May 3 2007 15:12:00')
2> go
Msg 249, Level 16, State 1:
Server 'ipnet', Line 1:
在VARCHAR的值'May 3 2007 15:12:00'到一个DATETIME域的隐式转换期间出现语法错误。
1> insert into test values(1,'May 3 2007 9:23AM')
2> go
Msg 249, Level 16, State 1:
Server 'ipnet', Line 1:
在VARCHAR的值'May 3 2007 9:23AM'到一个DATETIME域的隐式转换期间出现语法错误。
--------------------------------------------------------------------------------------------

(2) 本地设置 locale = default, us_english, eucgb

--------------------------------------------------------------------------------------------
1> select getdate()
2> go

--------------------------
Jul 3 2007 9:48AM

(1 row affected)
1> insert into test values(1,'七月 3 2007 9:34AM')
2> go
(1 row affected)
1> insert into test values(1,'七月 3 2007 15:12:00')
2> go
(1 row affected)
1> insert into test values(1,'May 3 2007 15:12:00')
2> go
Msg 249, Level 16, State 1:
Server 'ipnet', Line 1:
在VARCHAR的值'May 3 2007 15:12:00'到一个DATETIME域的隐式转换期间出现语法错误。
1> insert into test values(1,'May 3 2007 9:23AM')
2> go
Msg 249, Level 16, State 1:
Server 'ipnet', Line 1:
在VARCHAR的值'May 3 2007 9:23AM'到一个DATETIME域的隐式转换期间出现语法错误。
2> select * from test
3> go
id tt
----------- --------------------------
1 Jul 3 2007 9:34AM
1 Jul 3 2007 3:12PM
1 Jul 3 2007 3:12PM
1 Jul 3 2007 9:34AM
1 Jul 3 2007 3:12PM
1 Jul 3 2007 9:34AM
1 Jul 3 2007 3:12PM

--------------------------------------------------------------------------------------------

4.用english用户连接
(1) 本地设置 locale = default, chinese, eucgb
--------------------------------------------------------------------------------------------
1> select getdate()
2> go

--------------------------
七月 3 2007 9:57AM

(1 row affected)
1> insert into test values(1,'七月 3 2007 9:34AM')
2> go
Msg 249, Level 16, State 1:
Server 'ipnet', Line 1:
Syntax error during implicit conversion of VARCHAR value '七月 3 2007 9:34AM'
to a DATETIME field.
1> insert into test values(1,'七月 3 2007 15:12:00')
2> go
Msg 249, Level 16, State 1:
Server 'ipnet', Line 1:
Syntax error during implicit conversion of VARCHAR value '七月 3 2007
15:12:00' to a DATETIME field.
1> insert into test values(1,'May 3 2007 15:12:00')
2> go
(1 row affected)
1> insert into test values(1,'May 3 2007 9:23AM')
2> go
(1 row affected)
1> select * from test
2> go
id tt
----------- --------------------------
1 七月 3 2007 9:34AM
1 七月 3 2007 3:12PM
1 七月 3 2007 3:12PM
1 七月 3 2007 9:34AM
1 七月 3 2007 3:12PM
1 七月 3 2007 9:34AM
1 七月 3 2007 3:12PM
1 五月 3 2007 3:12PM
1 五月 3 2007 9:23AM

(9 rows affected)
--------------------------------------------------------------------------------------------

(2) 本地设置 locale = default, us_english, eucgb

--------------------------------------------------------------------------------------------
1> select getdate()
2> go
--------------------------
Jul 3 2007 9:58AM

(1 row affected)
1> insert into test values(1,'七月 3 2007 9:34AM')
2> go
Msg 249, Level 16, State 1:
Server 'ipnet', Line 1:
Syntax error during implicit conversion of VARCHAR value '七月 3 2007 9:34AM'
to a DATETIME field.
1> insert into test values(1,'七月 3 2007 15:12:00')
2> go
Msg 249, Level 16, State 1:
Server 'ipnet', Line 1:
Syntax error during implicit conversion of VARCHAR value '七月 3 2007
15:12:00' to a DATETIME field.
1> insert into test values(1,'May 3 2007 15:12:00')
2> go
(1 row affected)
1> insert into test values(1,'May 3 2007 9:23AM')
2> go
(1 row affected)
1> select * from test
2> go
id tt
----------- --------------------------
1 Jul 3 2007 9:34AM
1 Jul 3 2007 3:12PM
1 Jul 3 2007 3:12PM
1 Jul 3 2007 9:34AM
1 Jul 3 2007 3:12PM
1 Jul 3 2007 9:34AM
1 Jul 3 2007 3:12PM
1 May 3 2007 3:12PM
1 May 3 2007 9:23AM
1 May 3 2007 3:12PM
1 May 3 2007 9:23AM
1 May 3 2007 3:12PM
1 May 3 2007 9:23AM

(13 rows affected)
--------------------------------------------------------------------------------------------


5.总结,
原来本地设置中的语言的设置,只影响到本地显示使用英文还是中文显示,
如果设置成 chinese 所有的时间就会用中文显示。
如果设置成 us_english 所有的时间就会用英文显示。
但是这个仅仅影响本地的显示。
对于时间格式的识别 ,是认 'May 3 2007 3:12PM' 还是 '七月 3 2007 9:34AM' 这个和本地的设置是没有关系的。
这个是由数据库端设置的连接的语言有关系,
默认连接语言是 chinese 的话,就能识别 '七月 3 2007 9:34AM'
默认连接语言是 us_english 的话,就能识别 'May 3 2007 9:34AM'

原理应该是 datetime 在数据库里面是一种自己的特殊格式,传递到本地后,根据本地的 language 的设置转换成 'May 3 2007 3:12PM' 还是 '七月 3 2007 9:34AM'。
而作insert into 的时候 时间 会以字符的方式传送给数据库,数据库会用你连接的 语言 来解析 时间字符串,所以识别是和数据库端的设置有关系的。

所以才会出现用 selectd getdate() 出现的是英文,但是用insert into 插入的时候不识别 'May 3 2007 3:12PM' 的情况。
至于 'May 3 2007 3:12PM' 和 'May 3 2007 15:12:00' 这个对数据库来说是没有区别的。

注意: 如果本地的字符集和数据库端的字符集不一致,可能会导致连接的语言发生变化。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133835/viewspace-923482/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/133835/viewspace-923482/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值