2016-04-11 33 views
2

Bir datetime dosyasını bir smalldatetime'a dönüştürmeye çalışıyorum ve bir satır smalldatetime türü için aralık dışı bir tarih değerine sahipse, tarihi varsayılan değerine ayarlamak istiyorum izin verilen maksimum tarih ve yine de karşılaştırmamı yapıyor. shph.datetoship Örneğin 2080-01-11 00:00:00.000, için olduğunda Cast() smalldatetime için başarısız olduğunda varsayılan değer

SELECT Sum(Case When Cast(shph.datetoship as smalldatetime) < @day1datetoship Then shpd.ordered Else 0 End) as TotDemandPast 
FROM shipments shph 
WHERE shph.pending = 1; 

Bu yüzden @day1datetoship kıyasla daha sonra 2079-06-06 00:00:00.000 değiştirildi ve istiyorum.

Bunu yapmanın basit ve zarif bir yolu var mı?

Güncelleme:

daha testten sonra, iki cevabı bazı sorunlar vermek kanıtladı. Son olarak, Cast içinde başka bir Case bildirimi koyarak sorunu çözme bitti.

Final Kodu:

SELECT Sum(Case When Cast(Case WHEN shph.datetoship > '2079-06-06 00:00:00' THEN '2079-06-06 00:00:00' Else shph.datetoship END as smalldatetime) < @day1datetoship Then shpd.ordered Else 0 End) as TotDemandPast 
FROM shipments shph 
WHERE shph.pending = 1; 
+0

Neden 'DateTime' için her şeyi dönüştürmez sorguları

aşağıdaki kullanabilirsiniz SQL server daha düşük sürümleri için

ve kullanılan unutmayın karşılaştırmanı yap o zaman? Datetime'dan smalldatetime'a olan – David

+0

dökümünün aralık dışı sorunları olmayacak, tahminim varchar'dan smalldatetime'a geçtiğini tahmin ediyorum. Ve "2079-06-06 olarak değiştirilmesini istiyorum", hiçbir değişiklik yapmıyor =/ –

+0

Değişkeni neden yerine datetime yapmıyorsunuz? – UnhandledExcepSean

cevap

1

Sen Try_Parse sözdizimi kullanır bu sorguyu deneyebilirsiniz. Bu SQL sunucusunun yeni sürümlerinde (yukarıda 2012 ve)

SELECT 
    Sum(
     Case 
     When ISNULL(Try_parse(shph.datetoship as smalldatetime),'2079-06-06') < @day1datetoship 
     Then shpd.ordered 
     Else 0 
     End 
    ) as TotDemandPast 
FROM shipments shph 
WHERE shph.pending = 1; 
Eğer
SELECT 
    Sum(
     Case 
     When 
     ( 
     shph.datetoship >='1900-01-01' AND 
     shph.datetoship <='2079-06-06' AND 
     CAST(shph.datetoship as smalldatetime) < @day1datetoship 
     ) OR 
     ('2079-06-06' < @day1datetoship) 
     Then shpd.ordered 
     Else 0 
     End 
    ) as TotDemandPast 
FROM shipments shph 
WHERE shph.pending = 1; 
+0

Teşekkür ederim! Bu, SQL Server 2008 R2'de çalışıyor gibi görünüyor. –

1
DECLARE @shipments TABLE(
    datetoship DATETIME, 
    pending BIT, 
    ordered BIT 
) 

INSERT INTO @shipments SELECT '1899-01-01',1,1 
INSERT INTO @shipments SELECT '1900-01-01',1,1 
INSERT INTO @shipments SELECT '2079-06-06',1,1 
INSERT INTO @shipments SELECT '2079-06-07',1,1 

DECLARE @day1datetoship SMALLDATETIME='04/11/2016' 

SELECT 
    Sum(
     Case 
      WHEN shph.datetoship>='1900-01-01' and shph.datetoship<='2079-06-06 23:59' THEN 
       CASE 
        WHEN Cast(shph.datetoship as smalldatetime) < @day1datetoship then shph.ordered 
        Else 0 
       END 
      When '2079-06-06' < @day1datetoship Then shph.ordered 
      Else 0 
     End 
    ) as TotDemandPast 
FROM @shipments shph 
WHERE shph.pending = 1; 
+0

Bu da çalıştı, ancak seçilen cevap daha az adımda yaptı. Teşekkür ederiz @Ghost –