Sql 将不同格式的varchar转换为日期
我有一个包含varchar格式的日期列的表。日期格式各不相同,因为它是使用我们程序的计算机的日期格式。例如,我有以下格式: 10.7.2010 2010年11月7日上午7:36:55 我试过使用:Sql 将不同格式的varchar转换为日期,sql,sql-server-2005,Sql,Sql Server 2005,我有一个包含varchar格式的日期列的表。日期格式各不相同,因为它是使用我们程序的计算机的日期格式。例如,我有以下格式: 10.7.2010 2010年11月7日上午7:36:55 我试过使用: SELECT CONVERT(DateTime, Date, 103) AS Expr1 FROM MyTable 但我得到一个超出范围的datetime值异常,如下所示: 7/13/2010 3:33:45 PM 我需要一种将这些值转换为统一格式的方法。时间
SELECT CONVERT(DateTime, Date, 103) AS Expr1
FROM MyTable
但我得到一个超出范围的datetime值异常,如下所示:
7/13/2010 3:33:45 PM
我需要一种将这些值转换为统一格式的方法。时间和输出格式并不重要,只要它在复制到Excel或其他文件时具有可比性。它将在外部使用,因此我不介意不更改DB中的实际值。
数据库是MSSQL 2005。您需要阅读MSDN联机丛书-主题: 这将显示所有可能的、受支持的日期格式,例如
CONVERT(VARCHAR(50), GETDATE(), 112)
将今天的日期转换为ISO格式,您将得到20110707作为输出
为实现最大兼容性,我建议采用ISO-8601日期格式:
YYYYMMDD
或
无论您的SQL Server的日期、区域和语言设置如何,这些始终有效,始终可以转换
更新:
将现有字符串转换为日期或日期时间在很大程度上取决于您的语言/区域设置:
DECLARE @string1 VARCHAR(25) = '10.7.2010'
DECLARE @string2 VARCHAR(25) = '7/11/2010 7:36:55 AM'
DECLARE @string3 VARCHAR(25) = '7/13/2010 3:33:45 PM'
SET DATEFORMAT MDY
SELECT
CAST(@string1 AS DATE),
CAST(@string2 AS DATETIME),
CAST(@string2 AS DATETIME)
结果如下:
2010-10-07 2010-07-11 07:36:55.000 2010-07-13 07:36:55.000
2010-07-10 2010-11-07 07:36:55.000
日期解释为2010年10月7日、2011年7月11日和2010年7月13日
SET DATEFORMAT dmy
SELECT
CAST(@string1 AS DATE),
CAST(@string2 AS DATETIME)
结果如下:
2010-10-07 2010-07-11 07:36:55.000 2010-07-13 07:36:55.000
2010-07-10 2010-11-07 07:36:55.000
日期解释为2010年7月10日和2011年11月7日
当然,将@string3转换为具有这些设置的日期将失败,因为它试图将其解释为第13个月的第7个月。。。。。没有第13个月
由于这种模糊性,我建议始终使用ISO-8601格式,它清晰、标准化、始终有效,并且始终定义了实际表示的日期
更新2:
当然,如果给定字符串可以解释为有效日期,也可以使用ISDATE函数检查:
SELECT DateStr, ISDATE(DateStr) FROM dbo.YourTable
对于SET-DATEFORMAT DMY,字符串值“7/13/2010 3:33:45 PM”将被识别为无效:
SET DATEFORMAT DMY
SELECT ISDATE('7/13/2010 3:33:45 PM')
返回0作为其值。尝试使用和将上述值转换为日期时间转换时,我没有发现任何错误。 我认为您的数据格式不正确。请共享这些数据以获得更多帮助。 mean while检查查询以获取日期值 Declare @Table Table ( DateTimeCol varchar(100) ) insert into @Table Select '10.7.2010' UNION ALL Select '7/11/2010 7:36:55 AM' Select Convert(varchar,DateTimeCol,101) As Date From @Table
问题再次出现在这里,我们如何区分10.7.2010是MM.DD.YYYY还是DD.MM.YYYY。我可能遗漏了什么:我尝试从MyTable中选择CONVERTVARCHAR50,Date,112作为Expr1,但它不会改变值-各种格式仍然存在。@Talha Ahmed Khan:这是问题之一-取决于您的语言设置,这可能是两者中的任何一个。这就是为什么我要说:使用ISO-8601格式,它独立于您的语言和区域设置@谢谢你的更新,但是你的例子也使用了2010-07-11 07:36:55.000,而不是2010-07-13 07:36:55.000。在我的例子中,这是无法转换的一行。@marc_s:我知道,但是有些行有格式DMY和一些MDY,我希望能够以某种方式选择带有统一日期列的整个表。我可以转换的最后一行是2010年7月13日,下一行是2010年7月13日下午3:33:45,在这一行我得到一个例外。请注意,M/D订单在此处更改。还请注意,在您的示例中,有11个,而不是13个,可能是一天和一个月,也许这就是区别?转换13.7.2010肯定会出现异常,因为这不是正确的日期时间格式。您需要将datetime格式设置为set datetimeformat dmy