use*_*047 2 sql t-sql sql-server-2008
我在SQL中有一个表示日期的值,但它的类型为nvarchar.日期的值采用以下格式:
dd/mm/yyyy hh:mm
Run Code Online (Sandbox Code Playgroud)
我需要通过视图将此列呈现为CCure 800数据库DATETIME格式.我期望用CAST/ CONVERT; 但是,使用它时,会返回以下错误:
消息242,级别16,状态3,行1
将varchar数据类型转换为日期时间数据类型导致超出范围的值.
Aar*_*and 11
请停止将日期存储为字符串,尤其是作为Unicode字符串.您是否担心我们日历的某些未来版本会有变音符号,英镑符号,象形文字或普通话而不是数字?
将日期存储为日期.这就是那些数据类型的用途.除了不必担心无效的解释之外,你还可以获得像DATEPART和之类的东西的所有好处DATEADD,而且你不必担心任何人在废话栏中填充废话(从... 31/02/2012到'I don''t want to enter a real date'...
在此期间,您只需使用样式编号CONVERT(这将无法可靠地使用CAST):
SELECT CONVERT(DATETIME, '13/06/2013 09:32', 103);
Run Code Online (Sandbox Code Playgroud)
为了使它工作CAST,你可以相应地设置你的LANGUAGE或DATEFORMAT设置,但你不能在视图内执行此操作,并且它使代码非常脆弱无论如何恕我直言.
SET DATEFORMAT DMY;
SELECT CAST('13/06/2013 09:32' AS DATETIME);
Run Code Online (Sandbox Code Playgroud)
要么
SET LANGUAGE BRITISH;
SELECT CAST('13/06/2013 09:32' AS DATETIME);
Run Code Online (Sandbox Code Playgroud)
通过一个很宽的保证金,我更喜欢额外的控制CONVERT给你,而且几乎单方面改变的所有实例CAST来CONVERT,即使不需要这种控制,一致性(为什么用CAST在某些情况下,和CONVERT当你需要它的时候你可以CONVERT总是使用?).
编辑
要识别由于数据类型选择错误而陷入表中的垃圾数据,请执行此操作(然后修复数据,或者更好地修复数据类型,以便不再发生这种情况):
SET DATEFORMAT DMY;
SELECT date_column FROM dbo.table_name WHERE ISDATE(date_column) = 0;
Run Code Online (Sandbox Code Playgroud)