TSQL在嵌套查询中将varchar转换为datetime

时间:2015-09-22 09:23:17

标签: sql sql-server sql-server-2008

如果我在SQL中运行以下查询

SELECT TOP 1  
CONVERT(datetime,left(LD_publishdate,10),103) 
AS R   
FROM [patch_stats].[dbo].[vulns]  
ORDER BY R DESC

我正在......

  

"将varchar数据类型转换为日期时间数据类型   导致了超出范围的价值。"

但如果我跑

SET language British
SELECT LD_publishdate 
FROM [patch_stats].[dbo].[vulns]
WHERE ISDATE (LD_publishdate) = 1

然后只选择正确的值。

如何将第二个查询插入(嵌入)到第一个查询中,以便只转换正确的结果?

2 个答案:

答案 0 :(得分:1)

您需要停止在字符串中存储日期。您需要将日期存储为日期以避免此类问题。

您可以尝试设置

SET DATEFORMAT DMY;

答案 1 :(得分:0)

您可以将两个查询合并为:

SET language British
SELECT  
CONVERT(datetime,left(LD_publishdate,10),103) 
AS R   
FROM(
SELECT LD_publishdate 
FROM [patch_stats].[dbo].[vulns]
WHERE ISDATE (LD_publishdate) = 1
) T 
ORDER BY R DESC

但是请注意,如果表达式是datetime2值(我认为是这里的情况),ISDATE将返回0,但如果表达式是有效的{{1},则返回1 }值。

DEMO