如何在SQL Server中将varchar转换为可用日期?

时间:2017-06-21 17:59:17

标签: sql-server date

我在将nvarchar转换为日期时遇到了问题。

列标题为“DOS”,日期格式为'05 -03-2012'。

我正在尝试转换为日期,因此我可以在where子句中进行过滤。

我已经看过使用'CONVERT(datetime,DOS,101)'的解释,但我不知道这会发生什么?在选择?在where子句中?这是将varchar转换为日期的最佳方法吗?

select BedSize, avg(contributionmargin) as ContributionMargin from Summary where DOS > '06-30-2016' group by bedsize having avg(contributionmargin) > 10000 order by contributionmargin desc

在这个例子中,where子句只是查看日期中的'06'并选择大于06的值,因此结果包括:

  • 07/01/2013
  • 07/02/2009
  • 08/31/2009
  • 09/25/2012
  • 11/03/2016
  • 12/03/2008

问题是这些年被忽略了。

2 个答案:

答案 0 :(得分:1)

选项1:

在表格中添加一个新的日期时间列(让我们假设DOSDate),然后运行此查询

update mytable set DOSDate = STR_TO_DATE(DOS,'%m-%d-%Y')

但mytable中的未来插入也需要转换并存储在DOSDate`列中。

选项2:

如果您无法添加新列,请在where子句

中使用此列
select * from mytable where STR_TO_DATE(DOS,'%m-%d-%Y') >  p_mydate

由于您尚未提供查询,以上是一个示例查询来说明这一点。

更新

最初,您标记了与MySQL相关的问题。对于SQL Server,您可以使用CASTCONVERT代替STR_To_DATE https://msdn.microsoft.com/en-us/library/ms187928(v=sql.90).aspx

答案 1 :(得分:0)

根据Allen Allen的建议,我能够查看SQL Server的转换函数。

此代码有效:

select BedSize, avg(contributionmargin) as ContributionMargin
from Summary
where Convert(Date, DOS, 101) > '06-30-2016'
group by bedsize
having avg(contributionmargin) > 10000 
order by contributionmargin desc