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

TSQL在嵌套查询中将varchar转换为datetime,sql,sql-server,sql-server-2008,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数据类型转换为datetime数据类型 导致值超出范围。“ 但如果我跑 SET language British SELECT LD_publishdate FROM [patch_stats].[

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

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

“将varchar数据类型转换为datetime数据类型 导致值超出范围。“

但如果我跑

SET language British
SELECT LD_publishdate 
FROM [patch_stats].[dbo].[vulns]
WHERE ISDATE (LD_publishdate) = 1
然后仅选择正确的值


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

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

你可以试着设置

SET DATEFORMAT DMY;

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

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
但是请注意,如果表达式是
datetime 2
值(我认为这里就是这种情况),那么将返回0;如果表达式是有效的
datetime
值,那么将返回1


请标记所使用的dbms。(某些特定于产品的SQL…)您有一个查询,表面上看,它试图查找不可转换为日期的字符串,您希望将其嵌套在一个将尝试将字符串转换为日期的查询中?时区和日期格式是两个完全不同的东西。更重要的是,OP明确规定的
103
应该已经强制将日期解释为D/M/Y,不是吗?我知道。。。这是一个数据库和一个脚本,我是从前一个人那里继承的,我正在尝试清理它\调试它,actually@GeorgeMihailescu:-您能提供存储在
LD_publishdate
中的样本日期吗?@rahul tripathi:如果我使用设置语言,请从[patch_stats].[dbo].[vulns]中选择LD_publishdate,其中ISDATE(LD_publishdate)=1,然后我得到的LD_publishdate为2014年11月24日10:29:36,但如果我将其更改为WHERE ISDATE(LD_publishdate)=0,那么我得到的LD_publishdate为2015年6月25日12:00:00 AM,这是错误的,我希望它们要么不被考虑,要么转换为2014年11月24日10:29:36格式如果我使用的是嵌套查询,我回到了第一步,这意味着我得到的信息是:“将varchar数据类型转换为datetime数据类型导致值超出范围。”你知道如何解决这个问题吗?是的。。从您在问题中描述的内容来看,
ISDATE(LD_publishdate)=0
似乎给出了您想要转换为103格式的正确日期,但如果不是这样,那么您应该在内部查询中尝试作为:
ISDATE(LD_publishdate)=1
。。else
left(LD_publishdate,10)
没有提供所需格式的文本。您可以共享要转换为
datetime的
left(LD_publishdate,10)
的示例结果吗?如果我使用SET语言,请从[patch_stats].[dbo].[vulns]中选择LD_publishdate=1,然后我得到的LD_publishdate为2014年11月24日10:29:36,但如果我将其更改为WHERE ISDATE(LD_publishdate)=0,那么我得到的LD_publishdate为2015年6月25日12:00:00,这是错误的,我希望它们要么不被考虑,要么转换为2014年11月24日10:29:36格式,我仍然得到相同的结果“将语言设置更改为英国语。Msg 242,级别16,状态3,第2行varchar数据类型转换为datetime数据类型导致值超出范围。“我一定是做错了什么事。桌子上有没有触发器?