Sql 字符串到日期的转换有问题
勇士们,你们好 我需要一些帮助 我有以下SQL Select语句:Sql 字符串到日期的转换有问题,sql,sql-server,date,Sql,Sql Server,Date,勇士们,你们好 我需要一些帮助 我有以下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
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,16级,状态3,第1行varchar数据的转换
类型转换为日期时间数据类型导致值超出范围
我意识到在该列中,我有yyyymmdd
格式的日期,在mm和dd中有00。示例包括20130000
和20120300
我试图重新表述sql查询以处理这些条目
我的老板说,0000
应该反映1月1日
,00
应该反映1月1日
如何重新构造此SQL语句以反映此值,以便在不发生转换失败的情况下获得年/月组合
谢谢。您可以使用
REPLACE
来固定PurchaseDate
中的值,然后只需在其位置使用固定字段:
(在@t-clausen的正确注释后进行编辑)
例如,如果PP.PurchaseDate
等于20130000
,则上述查询将x.PurchaseDate
设置为等于20130101
,并在CONVERT
以及SELECT
子句中使用该值
要使所有这些都起作用,PurchaseDate必须是固定长度(8个字符)。最好的方法是senario将数据固定为日期,其次是将日期更改为字符(8)形式的有效日期 但你的问题是如何写你的选择 您不应该将购买日期转换为datetime,而应该将getdate()转换为char(8)。这会给你更好的表现。然后是varchar为20130000的问题。您可以通过从日期中减去1进行补偿,并要求更大的值,而不是更大的相等值 答案非常简单,并且可以提高性能,因为您的列上没有转换:
WHERE
PP.PurchaseDate >0
and PP.PurchaseDate >
CONVERT(char(8),DATEADD(MONTH,-1,getdate())-1, 112)
首先,我要修复我的数据。是否有理由让“20130101”和“20130000”表示相同的日期,但将两者保留为不同的值?问题可能在于convert(datetime,PP.PurchaseDate,112)>=DATEADD(MONTH,-1,convert(datetime,GETDATE(),112))@Amit,不幸的是,修复数据不是可选的,因为在其他查询中,20130000表示20131231。如果我可以的话,那就容易多了。哈哈。谢谢。这不是一个好答案。替换在2015-10-0x和2009-xx等日期失败-xx@t-是的,这是正确的。我已经改写了我的答案。我试图考虑这样一个事实,即OP似乎也希望在其查询的
SELECT
子句中重用“fixed”值。
WHERE
PP.PurchaseDate >0
and PP.PurchaseDate >
CONVERT(char(8),DATEADD(MONTH,-1,getdate())-1, 112)