如何将DATETIME与可以具有不同长度的VARCHAR日期进行比较?

时间:2011-10-11 23:37:11

标签: sql-server-2008

在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.dob01/05/1923中的C.date_of_birth不匹配。

如何格式化R.dob以便将其正确地与C.date_of_birth进行比较?

谢谢。

4 个答案:

答案 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