SORU
28 Mayıs 2009, PERŞEMBE


Nasıl SQL Server datetime kesecek miyim?

Bir datetime değer (saat, dakika ve saniye kaldırmak için) SQL Server 2008 kesmek için en iyi yolu nedir?

Örneğin:

declare @SomeDate datetime = '2009-05-28 16:30:22'
select trunc_date(@SomeDate)

-----------------------
2009-05-28 00:00:00.000

CEVAP
28 Mayıs 2009, PERŞEMBE


Bu Sql Server'ın yeni sürümleri için güncelleme gerekiyor bu yüzden sık sık ek oy toplamak için, iki yıl sonra bile devam ediyor. Sql Server 2008 ve daha sonra, basit bir şey

cast(getDate() As Date)

Alt kısmındaki son üç paragraf hala geçerli ve sık sık geri adım atmak ve bir şekilde ilk etapta dökme önlemek için olduğunu unutmayın.

Sql Server 2005 ve daha önce bunu yapmak için üç ortak yolu vardır:

(Sql Server 2008 Yeni beri) doğru yol:

cast(getdate() As Date)

(Eski) doğru yol:

dateadd(dd, datediff(dd,0, getDate()), 0)

Bu yaşlı, ama yine de kolayca ayın ilk an, dakika, saat, yıl gibi zaman puan için adapte olabilir, çünkü bilinmesi gerekenler.

Hızlı yolu:

cast(floor(cast(getdate() as float)) as datetime)

Yanlış yol:

cast(convert(char(11), getdate(), 113) as datetime)

Yanlış bir dizeye dönüştürme, dize kesiliyor, ve bir datetime geri dönüştürerek çalışır.yanlışiki sebepten dolayı: 1)Bu uygun olmayabilir genelinde tüm yerel ayarlar ve 2) ilgili en yavaş şekilde bunu yapmak... hem de hiç değil; sanki bir emir büyüklüğü ya da iki daha yavaş diğer seçenekler.

Hızlı şekilde datetimes sadece 8 bayt ikili değer olarak tutulur çünkü çalışır. Onları, katı, yüzer döküm, ve onları geri dökme ve saat bölümü gitti. Sadece biraz karmaşık mantık ile kaydiriyorçokhızlı. Ancak microsoft, herhangi bir zamanda değiştirmek için ücretsiz bir uygulama ayrıntı dayanır, hatta otomatik servis güncelleme. Aynı zamanda çok taşınabilir değil. Uygulamada, bu uygulama her zaman yakında değişecek olması çok düşük ihtimal, ama eğer kullanmak isterseniz hala önemli tehlikenin farkında olmak.

Bu doğru bir şekilde çalışmak için garantili belgelenmiş fonksiyonları kullanır, ama biraz daha yavaş. Orada nasıl geçerli günlük 0 dan bulma ve birçok gün ekleyerek tekrar gün 0 ile çalışır. Eğer datetime depolanan ne olursa olsun çalışacak ve bölgeniz ne olursa olsun.

GüncellemeBu has been getting biraz oy son zamanlarda, ve çok istiyorum eklemek bu yana yayınlanan bu gördüğüm bazı oldukça sağlam kanıtlar Sql Sunucu optimize deplasman performansı arasındaki fark "doğru" ve "hızlı" bir şekilde, yani şu iyilik eski.

Her iki durumda da, istediğinizsorularına ilk etapta bunu yapmak için ihtiyaç önlemek için yazıyorum. Veritabanında bu iş yapmanız gereken çok nadir görülür.

Çoğu yerde, veritabanı zaten darboğaz olduğunu. Genel olarak performans geliştirmeleri ve eklemeler bu hakkı elde etmek için en zor olanı (bellek, örneğin diskler dengelemek zorunda) için donanım eklemek için en pahalı olan sunucu. Bu da en zor ölçeği dışa, hem teknik hem de iş açısından, bu çok daha kolay teknik olarak Ekle web veya uygulama sunucusu daha bir veritabanı sunucusu ve bile vardı yanlış sen ödemiyorsun $20,000 sunucu başına lisans için IIS veya apache.

Yapmaya çalıştığım nokta mümkünse uygulama seviyesinde bu işi yapmak gerektiğidir.sadecesen hiç Kendin bulursun kesiliyor bir datetime Sql Server olduğunda ihtiyacınız grup tarafından gün, ve o zaman bile muhtemelen ekstra bir sütun kurmak gibi bir hesaplanan sütun, muhafaza Ekle/güncelle zaman, tutulan ya da uygulama mantığı. Bu dizin kırma, cpu-ağır off tabanı ile çalışır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Cumia

    Anthony Cumi

    5 EYLÜL 2006
  • Blunty

    Blunty

    13 Mart 2006
  • Breno Rises

    Breno Rises

    7 Ocak 2014