-1

我正在做这样的事情,我有两列月和年,我想创建一个新列,它将在 mm/dd/yyy fromat 中。所以在我的情况下,mm 是月份列,yyyy 是年列,日期是默认 01。

update [tablename]
set period= convert(date,month+'/01/'+year)

现在我希望这段时间是日期数据类型,我正在做:

alter table [tablename]
alter column period date

但它给了我错误,字符串无法转换为日期。如果有人可以提供帮助,那将非常有帮助。

4

1 回答 1

3

您的表中有错误的数据。由于您一开始没有使用正确的数据类型,因此/列中可能有任何内容,因为没有内置验证该月份为 1-12 并且年份在有效值范围内。例如,有人可以在月中输入 99,在年中输入 -213。monthyear

做这个:

SELECT period FROM dbo.tablename WHERE ISDATE([month] + '/01/' + [year]) = 0;

这应该确定您需要修复的行。如果这会返回整个表格,或者返回您认为应该是日期的值,那么请展示一些示例。您更新中的语法看起来不正确(至少缺少 a +)所以我不确定您实际上对您的表运行了什么,但事实并非如此。还有一种更安全的格式是:

SET period = [year] + [month] + '01';

这是因为您现在使用的 ,mm/dd/yyyy不受区域、语言和日期格式设置的影响。06/05/2013可以解释为 5 月 6 日而不是 6 月 5 日,并且11/13/2012可能返回错误,因为 SQL Server 不知道任何第 13 个月。这里有很多细节

而且您不需要先将其转换为日期。只需使用 ALTER 执行此操作 - 当它仍存储为字符串时,将其转换为日期对您几乎没有作用......

于 2013-10-25T13:45:22.883 回答