我有一个包含varchar格式的Date列的表。日期格式不同,因为它是使用我们程序的计算机的日期格式。例如,我有以下格式:
我尝试过使用:
SELECT CONVERT(DateTime, Date, 103) AS Expr1
FROM MyTable
但是我得到了以下行的超出范围的datetime值异常:
7/13/2010 3:33:45 PM
我需要一种方法将这些值转换为统一格式。时间和输出格式并不重要,只要它是可比较的(当复制到Excel或其他东西时。它要在外部使用,所以我不介意不更改DB中的实际值。)
该数据库是MSSQL 2005。
答案 0 :(得分:2)
您需要阅读MSDN联机丛书 - 主题:CAST and CONVERT。
这会显示所有可能支持的日期格式,例如
CONVERT(VARCHAR(50), GETDATE(), 112)
会将今天的日期转换为ISO格式,您将获得20110707
作为输出。
为获得最大兼容性,我建议使用ISO-8601日期格式:
YYYYMMDD
或
YYYY-MM-DDTHH:MM:SS
无论您的SQL Server的日期,区域和语言设置如何,总是可以转换它们,总是可以转换...
<强>更新强>
将现有字符串转换为DATE
或DATETIME
在很大程度上取决于您的语言/区域设置:
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年10月7日,2011年7月11日和2010年7月13日
SET DATEFORMAT dmy
SELECT
CAST(@string1 AS DATE),
CAST(@string2 AS DATETIME)
结果如下:
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
作为其值。
答案 1 :(得分:0)
尝试使用CAST和str_to_date
答案 2 :(得分:0)
将上述值转换为datetime转换时,我没有发现任何错误。 我认为您的数据日期格式不正确。请分享此类数据以获得更多帮助。 表示检查查询以获取日期值..
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