在SQL Server 2008中把varchar转换为date时的问题

0 人关注

我有一个 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的日期列,但无法做到这一点,因为它总是出现错误。

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

如果有人知道如何将这一列转换为具有上述所有指定值的日期列,请帮助。

3 个评论
SQL Server中的 DATETIME 没有 与之相关的 字符串格式 DATETIME 就是 DATETIME ,它被存储为8个二进制字节, 没有格式 。如何显示 DATETIME (作为一个字符串)是一个完全不同的故事 - 它取决于数据库的语言和区域设置。所以基本上你想把所有这些不同的字符串转换为 DATETIME ,对吗?
其中有些日期是不明确的。 首先 做一个数据清理工作,把它们全部转化为一个单一的(最好是不含糊的)格式, 一个由SQL Server支持的 格式, 然后 把它们放到一个 datetime 列中。
当你到了最后,你已经尽可能地把它们格式化了,你可以使用 ISDATE() 只转换可能转换的行。 CASE WHEN ISDATE(mycolumn) = 1 THEN CONVERT(DATETIME, mycolumn, <whichever style you've chosen>) ELSE NULL END
sql-server-2008
user1465667
user1465667
发布于 2012-06-19
2 个回答
marc_s
marc_s
发布于 2012-06-19
0 人赞同

要将一个 nvarchar 列转换为 DATETIME ,你需要使用T-SQL中的 CONVERT 函数。

这个函数支持一组 "样式"-- 所有这些都在MSDN上有很好的记录

如果你的源字符串与这些定义的样式之一相匹配,你可以使用适当的 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

如果你的字符串符合其中一种样式,你可以这样转换。