Ich habe eine Spalte INT in meiner Tabelle. In dieser Spalte wird das Datum in einem speziellen Format gespeichert. Ich versuche, diese Spalte in DATE-Typ zu konvertieren.Nummer in Datum in SQL Server mit Ausnahme in Monatsende konvertieren
Zum Beispiel behalten wir '2016-03-14'
als 20160314
.
Die Ausnahme ist, dass wir für den letzten eines jeden Monats keinen Tag speichern. Also für '2016-03-31'
speichern wir 201603
und ich muss prüfen, ob die Nummer less than 999999
oder nicht zu finden ist die Zahl ein Monatsende oder andere Tage im Monat darstellt.
Bisher habe ich zwei Abfragen, diese Aufgabe zu erreichen:
Abfrage 1:
Das ist alles Mathematik Formel.
declare @k int = 20160321
--declare @k int = 201603
select
IIF(@k < 999999
, EOMONTH(DATEFROMPARTS(@k /100, @k % 100, 1), 0)
, DATEFROMPARTS(@k /10000, (@k/100) % 100, @k % 100)
)
Abfrage 2: Dieser String-Manipulation verwendet.
declare @k int = 20160321
--declare @k int = 201603
select
IIF(@k < 999999
, EOMONTH(cast(LEFT(@k, 4) + '-' + RIGHT(@k, 2) + '-01' as date), 0)
, cast(LEFT(@k, 4) + '-' + RIGHT(LEFT(@k, 6), 2) + '-' + RIGHT(@k, 2) as date)
) AS DateColumn
Ich brauche die Umrechnungsformeln in WHERE
Klausel zu tun. Etwas wie:
SELECT K, Dt, Name -- and more fields
FROM tbl
WHERE IIF(K < 999999
, EOMONTH(DATEFROMPARTS(K /100, K % 100, 1), 0)
, DATEFROMPARTS(K /10000, (K/100) % 100, K % 100)
) < GetDate()
Und performance is important
Frage: Gibt es einen besseren Weg, dies zu tun? Möglicherweise eine Möglichkeit, wie SQL Server den Clustered-Index verwenden kann, den ich in der K-Spalte habe.
@hvd Er ist nicht. Er verwendet die Funktion EOMONTH(), die das Datum des letzten Tages des Monats zurückgibt. –
@hvd - ich denke, er hat das durch den Aufruf der 'EOMONTH' Funktion abgedeckt –
Ja Leute. Es könnte andere Wege geben, die denen, die ich gemacht habe, sehr ähnlich sind. Der Biestfall würde das tun, so dass SQL Server den Clustered-Index von have on K-Spalte verwenden kann. Ich füge das zum Körper der Frage hinzu. – FLICKER