SQL比较2个日期值(其中一个存储在varchar字段中,可能不包含Date数据)

时间:2014-06-12 13:20:44

标签: sql sql-server sql-server-2008 datetime varchar

我需要比较where子句中的日期值,即某个日期晚于另一个日期。出现的问题是我比较的日期存储在varchar字段中。为了使问题复杂化,简单的CONVERT将不起作用,因为存储在此varchar字段中的数据并不总是日期值,并且可以是任何旧的gubbins(这是现有的DB设计,不幸的是不能修改。遗留设计的乐趣/代码。)

以下是我目前所拥有的一个粗略的例子:

SELECT A.Value, B.Value, B.Value2
FROM Table A
JOIN Table B ON B.Id = A.Id
WHERE A.Value3 = 'Some String'
    AND ISDATE(B.GubbinsField) = 1 AND CONVERT(DATETIME, B.GubbinsField, 120) >= A.DateField

有没有人可以解决我如何成功检查这些值的问题?

2 个答案:

答案 0 :(得分:3)

您正走在正确的道路上您需要做的就是在比较运算符的两侧获得相同的列数据类型。

执行CONVERT(DATETIME, B.GubbinsField, 120) >= A.DateField

基本上您将字符串值与日期时间值进行比较。 Sql server将尝试将String转换为Datetime值,因为它具有更高的总体性。

您需要编写类似......的查询

;WITH CTE 
 AS (
    SELECT A.Value ValueA
         , B.Value ValueB
         , B.Value2
         , A.DateField
         ,B.GubbinsField
    FROM Table A
    JOIN Table B ON B.Id = A.Id
    WHERE A.Value3 = 'Some String'
      AND ISDATE(B.GubbinsField) = 1 
    )
SELECT ValueA, ValueB, Value2
FROM CTE
WHERE CAST(GubbinsField AS DATETIME) >= DateField

答案 1 :(得分:1)

尝试使用cte确保您只使用表B中在加入期间在GubbinsField中具有日期的记录:

;WITH cte AS (SELECT B.value, B.Value2, B.ID, B.GubbinsField FROM TABLEB B WHERE ISDATE(B.GubbinsField) = 1)
SELECT A.Value, B.Value, B.Value2
FROM Table A
JOIN cte B ON B.Id = A.Id
WHERE A.Value3 = 'Some String'
    AND CONVERT(DATETIME, B.GubbinsField, 120) >= A.DateField