2011-04-20 139 views
1

我有一个问题转换日期在SQL Server 2008中SQL服务器 - 日期转换

的价值,我将看起来像这样:30-NOV-44 08.00.00.000000000

结果我回来是这样的:2044-11-30 00:00:00.000

我正在使用的代码如下:

SELECT TOP 1000 [USER_ID] 
     ,CONVERT(datetime,SUBSTRING([DATEOFBIRTH],0,11),112) AS ConvertedDate 
     ,[DATEOFBIRTH] 
    FROM [IAM_Perf].[dbo].[01_Data] 
    WHERE DATEOFBIRTH IS NOT NULL 

无论我在CONVERT函数上使用什么参数,我都会得到相同的格式而且很多日期正在转化为未来?!

结果做改变,当我在CONVERT的第一个参数日期和日期时间之间进行切换,但它使对不正确的结果没有任何影响。

我现在用的子功能,否则它不会转换价值,并引发此错误:

Msg 241, Level 16, State 1, Line 1 Conversion failed when converting date and/or time from character string.

我不知道如何解决这个问题,我不能guaruntee格式将始终保持不变或者别的,我只想手动使用一些T-SQL

任何一个有什么想法重新格式化?

感谢,

马特

回答

3

由于将来的日期在SQL Server中完全有效的,该系统具有使用启发式时,你只传递一个2位数的日期。我相信启发式默认是年0-49在21世纪,50-99年是在20世纪。这一点,但是,configurable

你需要它,在你的数据库结束之前解决这一问题的数据,最好以日期时间列反正被存储出生日期(而不是作为一个字符串)。


datetime值不具有格式 - 但如果你已经转换的东西为日期时间,然后尝试以显示它,它总是会被转换回在同一格式的字符串(除非你使用CONVERT显式转换它)。

+1

作为补充,您必须对日期进行子串处理,因为时间不是包含所有句点的有效格式。如果您查看CONVERT函数的文档,您将会看到SQL不会将日期**转换为**,而只是一段时间。简而言之,只要SQL格式与CONVERT文档中的格式相同,SQL就只会将字符串转换为日期时间。 – Jim 2011-04-20 12:28:15

+0

正是我在找什么,教育的回应。 – Yoda 2011-04-20 12:39:28

3

可以使用

EXEC sp_configure 'show advanced options', 1 
RECONFIGURE 
EXEC sp_configure 'two digit year cutoff', 2011 
RECONFIGURE 

请注意,这是一个服务器范围的设置,可以打破在其他数据库查询配置的截止年份。

0

十分之二千零一十/ 10_

转换,然后使用subtring 选择*,子串((转换(VARCHAR(12),HIRE_DATE,121)),1,10)从雇员

这可以携带旁边的空间的日期 SUBSTRING([DATEOFBIRTH],0,11),112)

或 尝试此相同,用10位,转换可能发生良好 SUBSTRI NG([DATEOFBIRTH],0,10),112)