字符串到日期转换出现问题

时间:2015-05-22 05:28:15

标签: sql sql-server date

问候StackWarriors ....

我需要一些帮助。

我有这个SQL Select语句:

SELECT GEOID, cast(LEFT(PP.PurchaseDate,4) + RIGHT(Left(PP.PurchaseDate,6),2) as integer) AS Month 
FROM PropertyParametersNew PP
join PropertyTracts PT on PP.ParcelID = PT.PARCELID
WHERE
    PP.PurchaseDate >0
    and convert(datetime, PP.PurchaseDate, 112)>= DATEADD(MONTH,-1,getdate())

此查询中的意图是尝试获取GEOID以及PurchaseDate列中关联的年/月。

我收到此错误:

  

Msg 242,Level 16,State 3,Line 1 varchar数据的转换   键入日期时间数据类型会导致超出范围的值。

我意识到在该列中,我有yyyymmdd个格式化的日期,在mm和dd中有00&#39。示例包括2013000020120300

我正在尝试重新编写sql查询以处理这些条目。

我的所有者说0000应反映January 1,而00应该反映当月的第1天。

如何重构此SQL语句以反映此值,因此我可以在没有转换失败的情况下获得年/月组合?

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用REPLACE来修复PurchaseDate中的值,然后只需使用固定字段:

(@ t-clausen正确评论后编辑)

SELECT GEOID, 
       cast(LEFT(x.PurchaseDate,4) + RIGHT(Left(x.PurchaseDate,6),2) as integer) AS Month 
FROM PropertyParametersNew PP
CROSS APPLY (SELECT CASE WHEN RIGHT(PP.PurchaseDate, 4) = '0000' 
                           THEN LEFT(PP.PurchaseDate, 4) + '0101'
                         WHEN RIGHT(PP.PurchaseDate, 2) = '00'  
                           THEN LEFT(PP.PurchaseDate, 6) + '01'
                         ELSE PurchaseDate
                    END) x(PurchaseDate)
JOIN PropertyTracts PT on PP.ParcelID = PT.PARCELID
WHERE
    PP.PurchaseDate >0
    and convert(datetime, x.PurchaseDate, 112)>= DATEADD(MONTH,-1,getdate())

例如,如果PP.PurchaseDate等于20130000,则上述查询将x.PurchaseDate设置为20130101并在CONVERT内使用此值作为SELECTPP.PurchaseDate条款一样。

要使所有这一切工作,Path pt=new Path("hdfs://localhost.localdomain:8020/user/cloudera/myfile.txt"); 必须是固定长度(8个字符)。

答案 1 :(得分:1)

最佳的Senario将修复数据到目前为止第二好的是将您的日期更改为有效日期为char(8)。

但你的问题是如何写你的选择。

您不应该将购买日期转换为日期时间,您应该采用另一种方式将getdate()转换为char(8)。这将为您带来更好的表现。然后是varchar是20130000的问题。您可以通过从日期中减去1来补偿,并要求更大的值而不是更大的值。

答案非常简单并且提高了效果,因为您的列没有转化:

WHERE 
  PP.PurchaseDate >0
  and PP.PurchaseDate >
    CONVERT(char(8),DATEADD(MONTH,-1,getdate())-1, 112)