SQL Server游标将INT转换为日期

时间:2015-05-09 16:09:25

标签: sql-server date cursor sql-convert

我有一个列,其中日期存储为整数。这是我们无法改变的,因为它是旧ERP系统的一部分。如果我可以将列类型更改为日期或日期时间,我会。

日期存储为yymmdd

我正在尝试运行游标来更新此列,只捕获日期等于昨天日期的行。我的光标在下面。有什么建议吗?

DECLARE @ID NVARCHAR(50)
DECLARE @D1 NVARCHAR(50)
DECLARE @D2 NVARCHAR(50)
DECLARE CUR CURSOR FOR
    SELECT IMITNO, IMITD1, IMITD2 FROM [AS400].S062F7AR.APLUS83FDS.ITMST
        WHERE ISDATE(CONVERT(CHAR(6), IMLMDT)) >= DATEADD(DAY,-1,GETDATE());

OPEN CUR
FETCH NEXT FROM cur INTO @ID, @D1, @D2
WHILE (@@FETCH_STATUS = 0)
BEGIN

    UPDATE ProductBase
        SET new_AS400Description = @D1 + ' ' + @D2 
                WHERE ProductNumber = @ID

FETCH NEXT FROM CUR INTO @ID, @D1, @D2
END
CLOSE CUR
DEALLOCATE CUR

2 个答案:

答案 0 :(得分:1)

试试这个:

用这个替换你的选择:

SELECT * FROM 
( 
    SELECT IMITNO, IMITD1, IMITD2, IMLMDT FROM [AS400].S062F7AR.APLUS83FDS.ITMST 
        WHERE 
            ISDATE( 
                '2'+RIGHT('0000'+CAST(IMLMDT AS VARCHAR), 3) + '-' + 
                SUBSTRING(RIGHT('0'+CAST(IMLMDT AS VARCHAR), 6), 3, 2) + '-' + 
                SUBSTRING(RIGHT('0'+CAST(IMLMDT AS VARCHAR), 6), 5, 2) 
            ) = 1 
    ) AS A 
WHERE 
    IMLMDT >= CAST(CONVERT(Varchar, DATEADD(DAY,-1,GETDATE()), 12) AS INT);

由于您可能在该列上有一些不正确的值,因此上述SQL首先测试的是有效的日期格式,并且只能使用这些格式。

答案 1 :(得分:0)

尝试将select语句更改为

SELECT IMITNO, IMITD1, IMITD2 FROM [AS400].S062F7AR.APLUS83FDS.ITMST
    WHERE CONVERT(datetime,RIGHT('000000' + convert(char(6), IMLMDT),7)) >=
    DATEADD(DAY,-1,GETDATE());