理想的解决方案是在数据库中使用一TIMESTAMP
列而不是CHAR
(或MEMO
等)列。
您必须从字符字段转换为时间戳字段才能使用该TIMESTAMPADD
功能。
例如,这将输出2012-12-16
:
SELECT
LEFT(CONVERT(TIMESTAMPADD(SQL_TSI_MONTH, -1, CONVERT('2013-01-16 00:00:00', SQL_TIMESTAMP)), SQL_CHAR), 10)
FROM
system.iota
如果您的日期格式不在,ISO 8601
您必须在输入和输出中重新格式化日期字符串。
如果它包含01/16/13
(前导零),您可以使用它SUBSTRING
来重新格式化字符串:
DECLARE
@Input CHAR(20);
SET
@Input = '01/16/13';
SET
@Input =
'20'
+ SUBSTRING(@Input, 7, 2)
+ '-'
+ SUBSTRING(@Input, 1, 2)
+ '-'
+ SUBSTRING(@Input, 4, 2)
+ ' 00:00:00';
SELECT
LEFT(CONVERT(TIMESTAMPADD(SQL_TSI_MONTH, -1, CONVERT(@Input, SQL_TIMESTAMP)), SQL_CHAR), 10)
FROM
system.iota
如果数据库包含1/16/13
(没有前导零),则必须使用超出此问题范围的拆分字符串算法。
要重新格式化输出,您可以使用MONTH
,DAY
和YEAR
:
DECLARE
@Input CHAR(20);
DECLARE
@Temp TIMESTAMP;
SET
@Input = '01/16/13';
SET
@Input =
'20'
+ SUBSTRING(@Input, 7, 2)
+ '-'
+ SUBSTRING(@Input, 1, 2)
+ '-'
+ SUBSTRING(@Input, 4, 2)
+ ' 00:00:00';
SET
@Temp = TIMESTAMPADD(SQL_TSI_MONTH, -1, CONVERT(@Input, SQL_TIMESTAMP))
;
SELECT
TRIM(CONVERT(MONTH(@Temp), SQL_CHAR)) + '/' + TRIM(CONVERT(DAY(@Temp), SQL_CHAR)) + '/' + TRIM(CONVERT(YEAR(@Temp), SQL_CHAR))
FROM
system.iota
我建议您首先弄清楚如何使用我的示例中的变量来执行此操作。然后,您可以将其与您的INSERT INTO .. SELECT
陈述结合起来。
您应该知道,任何不是有效日期格式的东西都可能导致麻烦(由于CONVERT
错误等原因,整个语句没有执行)。
如果有任何不清楚的地方,您可以就您仍然遇到的具体问题发表评论或提出其他问题。