问候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。示例包括20130000
和20120300
。
我正在尝试重新编写sql查询以处理这些条目。
我的所有者说0000
应反映January 1
,而00
应该反映当月的第1天。
如何重构此SQL语句以反映此值,因此我可以在没有转换失败的情况下获得年/月组合?
感谢。
答案 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
内使用此值作为SELECT
和PP.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)