Sql server 2008 SQL Server 2008将varchar转换为日期时出现问题

Sql server 2008 SQL Server 2008将varchar转换为日期时出现问题,sql-server-2008,Sql Server 2008,我有一个nvarchar列,它包含不同格式的日期,如 '2/1/2012', '2/2/12', '20 01 12', '20 03 2012', '20.01.12', '30.04.2012', '20jan 12', '20-MARCH-2012', '22MARCH2012', '23 may 2012', '23-MAR-2012', '26MAR-2012', '27TH JAN 4660', 'CHL. Date- 30.01.2012', 'APRIL/12/2012', 'N

我有一个
nvarchar
列,它包含不同格式的日期,如

'2/1/2012',
'2/2/12',
'20 01 12',
'20 03 2012',
'20.01.12',
'30.04.2012',
'20jan 12',
'20-MARCH-2012',
'22MARCH2012',
'23 may 2012',
'23-MAR-2012',
'26MAR-2012',
'27TH JAN 4660',
'CHL. Date- 30.01.2012',
'APRIL/12/2012',
'N/A',
'DT.:5/1/12',
现在,我想以
dd/mm/yyyy
格式将此列中的数据插入到date列,但无法这样做,因为它总是给出错误

从字符串转换日期和/或时间时转换失败


如果有人知道如何使用上面定义的所有指定值将此列转换为日期列,请提供帮助。

最好的方法是编写一个函数,将该字符串转换为不含糊的日期字符串(yyyy-mm-dd)。然后可以将其转换为日期时间。现在有了将各种格式转换为日期格式的神奇方法。

要将
nvarchar
列转换为
DATETIME
,您需要使用T-SQL中的
convert
函数

此函数支持一组“样式”-

如果源字符串与这些定义的样式之一匹配,则可以使用相应的
CONVERT
从字符串中获取
DATETIME
。然而,T-SQL中并没有“魔力”来识别哪种转换样式将匹配您的字符串——这完全取决于您

通过此查询,您可以列出T-SQL的所有
CONVERT
样式:

DECLARE @Today DATETIME = GETDATE()

SELECT
    Default_100 = CONVERT(VARCHAR(50), @Today, 100),
    US_101 = CONVERT(VARCHAR(50), @Today, 101),
    ANSI_102 = CONVERT(VARCHAR(50), @Today, 102),
    BritishFrench_103 = CONVERT(VARCHAR(50), @Today, 103),
    Germany_104 = CONVERT(VARCHAR(50), @Today, 104),
    Italian_105 = CONVERT(VARCHAR(50), @Today, 105),
    Style106 = CONVERT(VARCHAR(50), @Today, 106),
    Style107 = CONVERT(VARCHAR(50), @Today, 107),
    Style108 = CONVERT(VARCHAR(50), @Today, 108),
    Default_with_ms_109 = CONVERT(VARCHAR(50), @Today, 109),
    USA_110 = CONVERT(VARCHAR(50), @Today, 110),
    Japan_111 = CONVERT(VARCHAR(50), @Today, 111),
    ISO_112 = CONVERT(VARCHAR(50), @Today, 112),
    Europe_default_with_ms_113 = CONVERT(VARCHAR(50), @Today, 113),
    Style114 = CONVERT(VARCHAR(50), @Today, 114),
    ODBC_canonical_120 = CONVERT(VARCHAR(50), @Today, 120),
    ODBC_canonical_with_ms_121 = CONVERT(VARCHAR(50), @Today, 121),
    ISO_8601_126 = CONVERT(VARCHAR(50), @Today, 126),
    ISO_8601_with_timezone_Z_127 = CONVERT(VARCHAR(50), @Today, 127),
    Hijri_130 = CONVERT(VARCHAR(50), @Today, 130),
    Hijri_131 = CONVERT(VARCHAR(50), @Today, 131)
如果源字符串与任何预定义的样式都不匹配,那就太倒霉了,需要更多的字符串解析和T-SQL代码才能将字符串转换为有效的
DATETIME

如果字符串与其中一种样式匹配,则可以按如下方式进行转换:

DECLARE @Date DATETIME
SET @Date = CONVERT(DATETIME, '30.04.2012', 104)

SQL Server中的
DATETIME
列没有与之关联的字符串格式。
DATETIME
DATETIME
DATETIME
-它存储为8个二进制字节-无格式。
DATETIME
如何显示(作为字符串)是一个完全不同的故事-它取决于数据库的语言和区域设置。因此,基本上您希望将所有这些不同的字符串转换为
DATETIME
-正确吗?其中一些日期是不明确的。首先进行数据清理练习,将所有数据转换为单个(最好是明确的)格式,然后将它们放入
datetime
列中。当您到达末尾并尽可能将其格式化时,您可以使用仅转换可能转换的行:
CASE When ISDATE(mycolumn)=1,然后转换(日期时间,mycolumn,