convertir la string date à date tapez dans sql server 2012

Dans un site Web d'école, je souhaite permettre à l'administrateur de filterr les élèves en fonction de la période à laquelle ils sont nés. Les dates de mon tblStudent sont stockées en tant que strings, donc je ne peux pas utiliser:

SELECT ts.Name from tblStudent ts WHERE ts.BirthDay>'1367/01/31' AND ts.BirthDay<'1377/01/31' 

J'ai sauvegardé des dates (Format Jalali) dans la table de database tblStudent. J'ai besoin de faire des comparaisons en fonction des dates. J'ai donc besoin de convertir les strings de date en type de date dans le server sql. À cette fin, j'ai utilisé:

 SELECT convert(date,tblStudent.BirthDay) from tblStudent 

Cependant, il s'arrête après 27 résultats avec l'erreur suivante

 Msg 241, Level 16, State 1, Line 1 Conversion failed when converting date and/or time from character ssortingng. 

J'ai les strings de date suivantes dans ma table tblStudent.

 1379/09/01 1375/04/20 1378/03/02 1378/03/21 1378/04/18 1378/04/18 1378/05/05 1375/04/20 1379/01/03 1378/03/01 1370/09/09 1378/03/22 1375/09/15 1379/09/01 1379/09/10 1375/04/08 1375/05/06 1370/09/09 1379/10/10 1375/04/10 1375/11/01 1375/04/04 1375/08/11 1375/05/05 1376/09/19 1375/12/12 1376/01/13 1375/15/10 1375/04/14 1375/04/04 1375/05/14 1374/11/11 1375/05/30 1375/05/14 1377/12/13 1377/02/31 1377/12/14 1377/01/13 1375/05/31 1377/11/05 1377/07/05 1375/05/31 1377/03/01 1377/04/01 1377/05/02 1377/05/04 1377/03/03 1377/01/14 1377/05/30 1377/04/31 1375/05/30 1376/06/12 1375/12/10 1377/08/14 1377/03/04 1375/04/08 1375/07/18 1375/08/09 1375/09/12 1375/11/12 1376/12/12 1375/01/02 1375/05/09 1375/04/09 1376/01/01 1375/01/30 1377/04/04 1375/05/23 1375/05/01 1377/02/01 1367/12/05 1375/05/31 1373/03/29 1373/03/03 1375/05/05 

Existe-t-il un moyen de convertir ces dates de type string en type de date, puis les comparer avec une requête? Par exemple, une telle requête peut être:

 SELECT ts.Name from tblStudent ts where ts.BirthDay>'1375/05/31' 

Je pense que vous pouvez en faire des ints et les comparer:

 SELECT ts.Name FROM tblStudent ts WHERE CONVERT(INT,REPLACE(ts.BirthDay,'/','') > 13670131 AND CONVERT(INT,REPLACE(ts.BirthDay,'/','') < 13770131 

Ou pour votre deuxième exemple:

 SELECT ts.Name FROM tblStudent ts WHERE CONVERT(INT,REPLACE(ts.BirthDay,'/','') > 13750531 

Cela fonctionnerait car avoir l'ordre Year-Month-Day assurera que la représentation int d'un time postérieur sera supérieure à la représentation int d'un time antérieur.

Je ne sais vraiment pas si c'est la meilleure idée, mais c'est une idée de comment le faire. Après tout, vous utiliseriez une conversion.

De C # vous avez quelques options:

  1. Si votre input est une string:

     var dateInt = Int32.Parse(dateSsortingng.Replace("/","")); 
  2. Si votre input est Date, alors:

     var dateInt = Int32.Parse(dateValue.ToSsortingng("yyyyMMdd")); 
  3. Vous pouvez également passer la string elle-même dans le db et laisser le db faire le travail pour vous:

     DECLARE @Date AS VARCHAR(10) SET @Date = ...--This will be filled with the inputed ssortingng DECLARE @DateINT AS INT SET @DateINT = CONVERT(INT,REPLACE(@Date,"/",""))