Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 - Fatal编程技术网

Sql 连接字符串到日期的转换

Sql 连接字符串到日期的转换,sql,sql-server-2008,Sql,Sql Server 2008,我在做这样的事情, 我有两个列“月”和“年”,我想创建一个新列,该列的格式为mm/dd/yyy fromat。所以在我的例子中,mm是月列,yyyy是年列,日期是默认值01 update [tablename] set period= convert(date,month+'/01/'+year) 现在我希望这段时间是日期数据类型,我正在执行以下操作: alter table [tablename] alter column period date 但它给了我一个错误,字符串不能转换为日期。

我在做这样的事情, 我有两个列“月”和“年”,我想创建一个新列,该列的格式为mm/dd/yyy fromat。所以在我的例子中,mm是月列,yyyy是年列,日期是默认值01

update [tablename]
set period= convert(date,month+'/01/'+year)
现在我希望这段时间是日期数据类型,我正在执行以下操作:

alter table [tablename]
alter column period date
但它给了我一个错误,字符串不能转换为日期。
如果有人能帮忙,那将非常有帮助。

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

这样做:

SELECT period FROM dbo.tablename WHERE ISDATE([month] + '/01/' + [year]) = 0;
这将标识需要修复的行。如果它返回整个表,或者返回您认为应该是日期的值,那么显示几个示例。更新中的语法看起来不正确(至少缺少一个
+
),因此我不确定您的表实际运行了什么,但事实并非如此。另一种更安全的格式是:

SET period = [year] + [month] + '01';
这是因为您现在使用的,
mm/dd/yyyy
,不受区域、语言和日期格式设置的影响
2013年5月6日
可能被解释为5月6日而不是6月5日,而
2012年11月13日
可能会返回错误,因为SQL Server不知道任何第13个月


你不需要先把它转换成日期。只要使用ALTER就可以了——当它仍然存储为字符串时,将其转换为日期对您没有什么帮助…

我问题中的“+”由于键入错误而丢失,而且我同意您的看法,即mm/dd/yyyy格式不安全。但根据我的要求,我只需要使用此格式的最终数据。@PiyushBhardwaj“此格式的最终数据”听起来像是您应该只在表示层中使用该格式,在该层中,您的客户端语言能够以您想要的任何字符串格式表示日期值。例如,C#有.Format()和.ToString(),它们可以做任何你想做的事情,而不必在数据库层的任何地方将这些日期视为字符串。所谓最终数据,我的意思是在我的表中,我想以mm/dd/yyyy格式存储数据。@Piyush不,你不需要。您存储的是一个日期,而不是某种特定格式的日期,它只是一个字符串。如果将日期存储为字符串,会损失很多,你真的不想这么做。如果你不想接受我的建议,那就把这个列保留为varchar或者其他什么。您不能将
DATE
列存储为您最喜欢的格式-它们根本不是以字符串形式存储的。而且句点列应该是日期类型。