在SQL Server 2008 R2中,我必须比较不同表中的两个出生日期。
C.date_of_birth
的类型为DATETIME
R.dob
是一个存储为VARCHAR
的日期,但在月份或日期部分没有前导零,以使其长度保持一致(< - 这是最难的部分)。我已经接近了这个:
where R.dob <> convert(varchar, cast(C.date_of_birth as DATE), 101)
但返回的行太多,因为1/5/1923
中的R.dob
与01/05/1923
中的C.date_of_birth
不匹配。
如何格式化R.dob
以便将其正确地与C.date_of_birth
进行比较?
谢谢。
答案 0 :(得分:1)
您可以将varchar转换为日期时间。例如,结果如下:
select cast('1/5/1923' as datetime)
将是1923-01-05 00:00:00.000
然后你可以使用DATEDIFF()
来比较它们,看看它们是哪一天(或你想要的任何间隔)。
答案 1 :(得分:0)
这个怎么样?
declare @date_of_birth datetime = '1923-01-05',
@dob varchar(10) = '01/05/1923'
select @date_of_birth,
CONVERT(datetime, @dob, 101), -- 101: mm/dd/yyyy
case when @date_of_birth = CONVERT(datetime, @dob, 111)
then 1 else 0
end result
答案 2 :(得分:0)
我会尝试将varchar字段转换为日期并进行比较;例如,所有这些格式都可以轻松转换为日期类型:
SELECT cast ( '1/1/2011' as date) col1
union
SELECT cast ( '01/11/2011' as date) col1
union
SELECT cast ( 'Oct 7 2011' as date) col1
union
SELECT cast ( '2011-02-23' as date) col1
输出:
col1
----------
2011-01-01
2011-01-11
2011-02-23
2011-10-07
因此,在您的查询中,您可以将日期与日期进行比较。
答案 3 :(得分:0)
正如其他人所说,第一种选择是将R.Dob
的数据类型更改为Date
。
否则,您应该将varchar
转换为date
,并且根据您的评论,您会收到错误消息。原因可能是因为列中的日期无效。您可以使用isdate函数来确定哪些行具有无效日期。
另一个原因可能是您的SQL Server不知道如何解释您的日期字符串。
我不知道如何解释这个值1/5/1923
所以SQL Server怎么知道?
使用set dateformat告诉SQL Server如何解释日期字符串。
set dateformat mdy
select cast('1/5/1923' as date)
set dateformat dmy
select cast('1/5/1923' as date)
结果:
----------
1923-01-05
----------
1923-05-01