到目前为止,将varchar转换为不同的格式

时间:2011-07-07 05:46:13

标签: sql sql-server-2005

我有一个包含varchar格式的Date列的表。日期格式不同,因为它是使用我们程序的计算机的日期格式。例如,我有以下格式:

  1. 2010年7月10日
  2. 7/11/2010 7:36:55 AM
  3. 我尝试过使用:

    SELECT        CONVERT(DateTime, Date, 103) AS Expr1
    FROM            MyTable 
    

    但是我得到了以下行的超出范围的datetime值异常:

    7/13/2010 3:33:45 PM
    

    我需要一种方法将这些值转换为统一格式。时间和输出格式并不重要,只要它是可比较的(当复制到Excel或其他东西时。它要在外部使用,所以我不介意不更改DB中的实际值。)
    该数据库是MSSQL 2005。

3 个答案:

答案 0 :(得分:2)

您需要阅读MSDN联机丛书 - 主题:CAST and CONVERT

这会显示所有可能支持的日期格式,例如

CONVERT(VARCHAR(50), GETDATE(), 112)

会将今天的日期转换为ISO格式,您将获得20110707作为输出。

为获得最大兼容性,我建议使用ISO-8601日期格式:

YYYYMMDD

YYYY-MM-DDTHH:MM:SS

无论您的SQL Server的日期,区域和语言设置如何,总是可以转换它们,总是可以转换...

<强>更新

将现有字符串转换为DATEDATETIME在很大程度上取决于您的语言/区域设置:

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)

尝试使用CASTstr_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