datetime
veri türüyle gruplanacak ancak saat ve dakika gibi zaman bölümünü göz ardı edecek bir Microsoft SQL sorgusu yazmak mümkün mü?Grup tarafından datetime zaman bölümünü yok sayılıyor
cevap
SQL Server 2008 kullanıyorsanız, bu basittir. Bunlardan hiçbiri datetime
tarafından sipariş edilir YourCol
üzerinde bir dizin de kullanmak böylece date
tarafından sipariş edilecek ve gerçeğini kaldıraç mümkün olacak Ancak
GROUP BY CAST(YourCol AS Date)
önceki sürümleri için,
GROUP BY DATEDIFF(DAY, 0, YourCol)
kullanabilirsiniz sıralama işlemi olmayan bir akış toplaması.
SQL Server 2008+'de, bu tür sorgulamayı kolaylaştırmak için datetime
yerine (date,time)
dizinini kullanmayı düşünebilirsiniz.
ya sadece iki ayrı bileşen olarak depolamak ve muhtemelen parçaları birleşir hesaplanmış bir sütun sağlayan (a datetime2
bir date
aynı saklanır ve bir time
bu ek ise dışında herhangi bir fazla boşluk tüketmek olmaz sütun NULL_BITMAP
yeni bir bayt üzerine iter.).
CREATE TABLE T
(
YourDateCol date,
YourTimeCol time,
YourDateTimeCol AS DATEADD(day,
DATEDIFF(DAY,0,YourDateCol),
CAST(YourTimeCol AS DATETIME2(7)))
/*Other Columns*/
)
Veya alternatif bunun temel tabloda birleştirilir ve depolayabilir endeksleri dışarı ayrıldı hesaplanan sütunları kullanın var.
Büyük bir tablo var ve hızlı gerçekleşmesi gruplandırma istediğiniz takdirde bu yaklaşım
CREATE TABLE T
(
DT DATETIME2,
D AS CAST(DT AS DATE),
T AS CAST(DT AS TIME)
)
CREATE INDEX IX1 ON T(DT);
SELECT COUNT(*),
CAST(DT AS DATE)
FROM T
GROUP BY CAST(DT AS DATE)
CREATE INDEX IX2 ON T(D,T);
SELECT COUNT(*),
CAST(DT AS DATE)
FROM T
GROUP BY CAST(DT AS DATE)
DROP TABLE T
'GRUP BY DATEDIFF (GÜN, 0, YourCol)' da muhtemelen bu durumda yeterli olacaktır ... – Tomalak
@Tomalak - İyi nokta. Bu, "grup" için "int" olan ve görüntüleme amaçları haricinde "datetime" a dönme nedeni olmayan bir "int" döndürecektir. –
bir örneği, bir ifadeye gruplandırma güvenir olamaz.
UPDATE
MyTable
SET
EffectiveDate = DATEADD(DAY, 0, DATEDIFF(DAY, 0, t.RecordDate))
FROM
MyTable t
INNER JOIN inserted i ON i.RowID = t.RowID
Sonra EffectiveDate
üzerinde bir dizin koymak ve gruplama (ve arama):
masanızdaki ek bir datetime sütunu oluşturun ve bunu "gerçek" tarihinden itibaren baz tarihini hesaplayan bir tetikleyici ile doldurduktan çok daha hızlı olacak.
SQL Server 2008 için döküm [tarihçe sarj edilebilir] (http://connect.microsoft.com/SQLServer/feedback/details/526431/make-more-functions-sargable) bunun kaldırılıp kaldırılmadığını kontrol etmedim '' grup sorguları ile gruplandır. –
@Martin İlginç, bunu bilmiyordum. Ancak, sütun üzerinde indeks olmadığında hala bir tablo taraması tetiklenir, değil mi? – Tomalak
Neden bir tetikleyici ve hesaplanmış bir sütun değil? CONVERT (DATETIME, DATEADD (GÜNDÜZ, 0, DATEDIFF (GÜN, 0, t.RecordDate)))) - Bu sütun sarsılabilirlik ile ilgili herhangi bir şüphe çıkarmak için de kalıcı ve endeksli olabilir. tetik. –
- 1. XmlElement Özniteliği, Microsoft.AspNet.Mvc.Formatters.Xml tarafından yok sayılıyor
- 2. Yok sayılıyor/filtreleniyor
- 3. Mongodb çoklu grup alanları ile farklı sayılıyor
- 4. Capybara + RSpec, spec/features rspec tarafından yok sayılıyor. Komut?
- 5. BitmapImage RequestCachePolicy neden yok sayılıyor?
- 6. Tanımlı istemci önbelleği yok sayılıyor
- 7. Fulltext arama yorum yok sayılıyor
- 8. Mongo - Kalıcı özelliği yok sayılıyor
- 9. YML doğrulama dosyası yok sayılıyor
- 10. Zaman bölümünü korurken, bir DateTime'ın yalnızca tarih bölümünü nasıl değiştirebilirim?
- 11. Bir DateTime alanının MySQL yok sayma zaman bölümündeki tarihlerin karşılaştırılması
- 12. Grup tarafından artırım
- 13. MySQL - Grup Sıralama ile DESC tarafından
- 14. row_number() Grup tarafından?
- 15. Grup tarafından ortalama değerler
- 16. apache yeniden yazma kuralı yok sayılıyor
- 17. iOS 9 hata - css kuralları yok sayılıyor
- 18. Genel .gitignore dosyam neden yok sayılıyor?
- 19. Hata ayıklayıcıda kaynak kodu yok sayılıyor
- 20. Bazı öğeler/sınıflar JAXB bağında yok sayılıyor
- 21. Temel sınıfta bildirilen imzalar neden yok sayılıyor?
- 22. Spring Boot yok sayılıyor logback-spring.xml
- 23. DateTime tarafından Ecto'da sorgulama
- 24. NEST 2.0'daki bazı POCO özelliklerini yok sayılıyor/yok
- 25. datetime tarafından filtre MYSQL biçimlendirmesi
- 26. Zaman damgasından günlük grup
- 27. <machineKey decryptionKey = "AutoGenerate" ... IIS tarafından yok sayılıyor. önceki oturumun çerezleri geçersiz olmaz
- 28. Her grup tarafından grup sırasına göre sıralama ve sıralama?
- 29. Entity Framework atlamak, grup tarafından
- 30. Özel Arama ve Grup Tarafından
Hangi SQL Server sürümü? Bu özel soru için önemli. (SQL Server'ın tüm sürümlerinde * mümkündür *, ancak daha iyi bir çözüm var 2008+) – RBarryYoung
olası bir kopyası [SQL Server'da datetime nasıl kırpılır] (http://stackoverflow.com/questions/923295/ truncate-a-datetime-in-sql-server) ve [diğerleri] (http://www.google.com/cse?cx=018205968162215846785%3A7n6ajnwyz-i&ie=UTF-8&q=sql+server+ truncate +% 28datetime | time% 29 & sa = Ara & siteurl = www.google.com% 2Fcse% 2Fhome% 3Fcx% 3D018205968162215846785% 3A7n6ajnwyz-i) –
@AndriyM - Bir 'datetime' tarihinin parçası tarafından gruplandırma belirli bir optimizasyon problemi sunar Tarih bölümünün sadece kesilmesinin ötesinde. Örneğin. CREATE TABLE T1 (D DATETIME2 PRIMARY ANAHTAR) için CREATE TABLE T2 (D TARİH, T TIME, PRİMARY ANAHTAR (D, T)) için planları karşılaştırmak; T1 GRUP TARAFINDAN DÖNÜŞÜMÜ (* DATE) SEÇENEĞİ (SİPARİŞ GRUBU); T2 GRUBUNUN TARAFINDAN SEÇENEĞİ SAYFASI (SİPARİŞ GRUBU) ' –