SQL 服务器游标将 INT 转换为日期
SQL Server Cursor Converting INT to Date
我有一列将日期存储为整数。这是我们无法更改的,因为它是旧 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
尝试将您的 select 语句更改为
SELECT IMITNO, IMITD1, IMITD2 FROM [AS400].S062F7AR.APLUS83FDS.ITMST
WHERE CONVERT(datetime,RIGHT('000000' + convert(char(6), IMLMDT),7)) >=
DATEADD(DAY,-1,GETDATE());
试试这个:
用这个替换你的 select:
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 首先测试有效的日期格式并且只使用那些。
我有一列将日期存储为整数。这是我们无法更改的,因为它是旧 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
尝试将您的 select 语句更改为
SELECT IMITNO, IMITD1, IMITD2 FROM [AS400].S062F7AR.APLUS83FDS.ITMST
WHERE CONVERT(datetime,RIGHT('000000' + convert(char(6), IMLMDT),7)) >=
DATEADD(DAY,-1,GETDATE());
试试这个:
用这个替换你的 select:
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 首先测试有效的日期格式并且只使用那些。