2015-09-07 3 views
0

У меня есть хранимая процедура, подобная этой. Если я попытаюсь выполнить его в течение 1-го июня до 31-го июля, он показывает ошибку преобразования. Кто-нибудь может помочь, как это исправить? Он показывает результаты за 1-е июня и 30-е годы работы. Но если я использую 31 июля, это не работает.Как решить «Ошибка преобразования типа данных varchar в дату»

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER procedure [dbo].[Samp] 
     (@StartDate date , 
     @EndDate date, 
     @Flowid int) 
AS 
BEGIN 
    if(@Flowid = 909) 
    begin 
     select 
      COUNT(distinct a.Audit_id) 
     from 
      [Prod_Workflow_Client41].[dbo].[CustomValues909] a 
     join 
      [Prod_Workflow_Client41].[dbo].[Audit] b on a.id = b.id 
     join 
      [Prod_Workflow_Client41].[dbo].[Substatus] c on c.Id = b.Substatus_id 
     where 
      c.MajorStatus <> 'Cancelled' 
      and a.Auditor_Reviewed_Date >= @StartDate 
      and a.Auditor_Reviewed_Date <= @EndDate 
    end 
    else if @Flowid = 1010 
    begin 
     select 
      COUNT(distinct a.Audit_id) 
     from 
      [Prod_Workflow_Client41].[dbo].[CustomValues1010] a 
     join 
      [Prod_Workflow_Client41].[dbo].[Audit] b on a.id = b.id 
     join 
      [Prod_Workflow_Client41].[dbo].[Substatus] c on c.Id = b.Substatus_id 
     where 
      c.MajorStatus <> 'Cancelled' 
      and a.Auditor_Reviewed_Date >= @StartDate 
      and a.Auditor_Reviewed_Date <= @EndDate 
    end 
    else if @Flowid = 101 
    begin 
     select 
      COUNT(distinct a.Audit_id) 
     from 
      [Prod_Workflow_Client41].[dbo].[CustomValues101] a 
     join 
      [Prod_Workflow_Client41].[dbo].[Audit] b on a.id = b.id 
     join 
      [Prod_Workflow_Client41].[dbo].[Substatus] c on c.Id = b.Substatus_id 
     where 
      c.MajorStatus <> 'Cancelled' 
      and a.Auditor_Reviewed_Date >= @StartDate 
      and a.Auditor_Reviewed_Date <= @EndDate 
    end 
end 
--exec [dbo].[Samp] '01/06/2015','31/06/2015',909 
--exec [dbo].[Samp] '01/06/2015','30/06/2015',1010 
--exec [dbo].[Samp] '01/06/2015','30/06/2015',101 
+0

Вы должны попытаться сломать свой код части, которая вызывает проблему. –

+0

столбец a.Auditor_Reviewed_Date имеет тип nvarchar (max). – Perumal

+1

[Плохие привычки пинать: выбор неправильного типа данных] (http: // sqlblog .com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-use-the-wrong-data-type.aspx) - вы всегда должны использовать наиболее подходящий тип данных - вот что они " в конце концов! Если у вас есть ** DATE ** - вы должны ** хранить его как таковое! ** Не храните даты как 'varchar' и наиболее определенно не как' varchar (max) '(или вы когда-либо видели дату, которая почти ** 2 миллиарда символов ** длинный?!?!) –

ответ

1

SQL сервер использует формат (мм/дд/гггг) для этих неявных преобразований, поэтому ввод '01/06/2015' фактически преобразуется в 6 января 2015, что, очевидно, является допустимой датой. Если вы введете '31/07/2015' SQL-сервер попытается преобразовать это в 7-й день 31-го месяца, что является недопустимым и почему вы получаете ошибку преобразования.

Кроме того, в вашем примере вы указали 31 июня 2015 года, который не является датой.

+0

Как я могу сделать преобразование..и все испробовало – Perumal

+0

Во-первых, вам нужно убедиться, что вы ввели даты в правильном формате при вводе их в мм/дд/гггг. 31 июля было бы 07/31/2015, во-вторых, вы необходимо убедиться, что вы всегда вводите действительную дату, ваш пример в вашем вопросе показал, что вы пытаетесь ввести 31 июня, что не является датой. – steoleary

+0

, в каком формате мне нужно дать во время исполнения. Я хочу дать как 01/06/2015 по 30/06/2015, он дает неправильные результаты – Perumal

Смежные вопросы