2013-03-07 247 views
0

我在SQL中有一个代表日期的值,但是它的类型为nvarchar。日期的值的格式为:将英国格式日期转换为日期时间

dd/mm/yyyy hh:mm 

我需要经由图中DATETIME格式呈现这个列到CCure 800数据库。我预计会使用CAST/CONVERT;然而,使用这种时,返回以下错误:

消息242,级别16,状态3,行1
varchar数据类型为datetime数据类型的转换导致的失范围值。

+0

也有类似的问题。请参阅[建议]之一(https://stackoverflow.com/questions/20838344/sql-the-conversion-of-a-varchar-data-type-to-a-datetime-data-type-resulted-in/ 38081347#38081347)可以完成。 – Sumit 2016-06-28 16:24:45

回答

10

请停止将日期存储为字符串,并且尤其是作为Unicode字符串。你担心我们日历的某些未来版本会有变音符号,英镑符号,象形文字或普通话而不是数字吗?

以日期存储日期。这就是那些数据类型的用途。除了不必担心无效解释外,您还可以获得诸如DATEPARTDATEADD之类的所有好处,而且您不必担心任何人将废话塞进列中(任何从31/02/2012'I don''t want to enter a real date''I don''t want to enter a real date' ...

在此期间,您只需要使用带有CONVERT风格号(这不会与CAST可靠地工作):

SELECT CONVERT(DATETIME, '13/06/2013 09:32', 103); 

,使其与CAST工作,你可以设置你的LANGUAGEDATEFORMAT设置因此,但你不能这样做一个看法,它使代码非常脆弱无论如何恕我直言。

SET DATEFORMAT DMY; 
SELECT CAST('13/06/2013 09:32' AS DATETIME); 

或者

SET LANGUAGE BRITISH; 
SELECT CAST('13/06/2013 09:32' AS DATETIME); 

通过一个很宽的保证金,我更喜欢控制附加CONVERT给你,而且几乎单方面改变CAST所有实例CONVERT,即使不需要这种控制,用于一致性(为什么在某些情况下使用CAST,在需要时使用CONVERT,何时总是使用CONVERT?)。

编辑

要确定已潜入你的表,因为一个糟糕的数据类型选择的垃圾数据,做到这一点(再修复数据,或者更好的,固定的数据类型,因此这并未再次发生):

SET DATEFORMAT DMY; 
SELECT date_column FROM dbo.table_name WHERE ISDATE(date_column) = 0; 
+0

谢谢 - 理解日期的理论,你说得很对。但是我们假设在这种情况下这是不可能的。 – user2145047 2013-03-07 16:53:47

+0

@ user2145047好吧,我仍然提供*答案*。阅读“在此期间”... – 2013-03-07 16:54:14

+0

我尝试使用CONVERT也(以及CAST),但问题的关键是,它不会工作时,字符串的格式完全是“DD/MM/YYYY HH:MM“ - CONVERT不会将其转换为日期。 – user2145047 2013-03-07 16:54:59

相关问题