Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将不同格式的varchar转换为日期_Sql_Sql Server 2005 - Fatal编程技术网

Sql 将不同格式的varchar转换为日期

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 我需要一种将这些值转换为统一格式的方法。时间

我有一个包含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
我需要一种将这些值转换为统一格式的方法。时间和输出格式并不重要,只要它在复制到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