SQL Server - 日期转换

时间:2011-04-20 12:14:44

标签: sql-server tsql sql-server-2008

我在SQL Server 2008中转换日期时遇到问题

我转换的价值如下: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的第一个参数中的日期和日期时间之间切换时,结果会发生变化,但它对不正确的结果没有影响。

我正在使用substring函数,否则它不会转换该值并抛出此错误:

  

消息241,级别16,状态1,行1转换日期转换失败   和/或来自字符串的时间。

我不确定如何解决这个问题,我无法保证格式将始终保持不变,否则我只需使用某些T-SQL手动重新格式化

任何人都有任何想法?

谢谢,

马特

3 个答案:

答案 0 :(得分:3)

由于未来日期在SQL Server中完全有效,因此当您仅将日期传递给2位数时,系统必须使用启发式算法。我认为默认的启发式是0-49岁是在21世纪,50-99岁是在20世纪。但是,这是configurable

您需要在数据到达数据库之前修复此数据,并且最好将DateOfBirth存储在datetime列中(而不是作为字符串)。


日期时间值没有格式 - 但是如果您已将某些内容转换为日期时间,然后尝试显示它,它将始终以相同的格式转换回字符串(除非您明确转换它)使用CONVERT)。

答案 1 :(得分:3)

您可以使用

配置截止年份
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'two digit year cutoff', 2011
RECONFIGURE

请注意,这是服务器范围的设置,可能会破坏其他数据库上的查询

答案 2 :(得分:0)

2010/10/10 _

转换然后使用子字符串 从员工中选择*,子串((convert(varchar(12),hire_date,121)),1,10)

这可能会带有日期旁边的空格 SUBSTRING([DATEOFBIRTH],0,11),112)

或 尝试使用10位数字,转换可能会发生 SUBSTRING([DATEOFBIRTH],0,10),112)