我在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手动重新格式化
任何人都有任何想法?
谢谢,
马特
答案 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)