Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 字符串到日期的转换有问题_Sql_Sql Server_Date - Fatal编程技术网

Sql 字符串到日期的转换有问题

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

勇士们,你们好

我需要一些帮助

我有以下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,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)