Konvertieren Sie den Namen eines Tages zu seiner Integer-Darstellung
-
23-08-2019 - |
Frage
In SQL Server können Sie die DATENAME-Funktion nutzen den Tag der Woche als String zu bekommen
declare @date datetime
set @date = '12/16/08'
select datename(dw, @date)
, die "Dienstag"
zurückund Sie können die DATEPART-Funktion verwenden, den Wochentag als ganze Zahl zu erhalten
declare @date datetime
set @date = '12/16/08'
select datepart(dw, @date)
Welche Returns 3
Aber sagen, ich habe eine varchar, die die Zeichenfolge „Dienstag“ enthält und ich möchte es konvertieren, um seine Integer-Darstellung von 3. Klar, ich könnte die Umwandlung ohne viel Aufwand schreiben, aber ich würde viel lieber einen eingebauten verwenden -in Funktion. Gibt es eine solche Funktion gibt es?
Lösung
Anstatt eine Funktion zu schreiben, Sie einen Tag der Woche Tabelle mit der Beschreibung und dem numerischen Wert schaffen sollen. Dann können Sie einfach auf den Tisch kommen die nummerische zu erhalten.
Und wenn Sie Tage mehrere Möglichkeiten (wahrscheinlich in einem zeichenorientierte System) gespeichert haben, können Sie alle Varianten in den Tisch legen, so TUE, Di., Dienstag würden alle auf denselben ganze Zahl ist.
Andere Tipps
leider gibt es keine integrierte Funktion, aber Sie können Ihre eigene wie folgt erstellen:
CREATE FUNCTION dbo.WeekDay(@DayOfWeek Varchar(9))
RETURNS INT
AS
BEGIN
DECLARE @iDayofWeek INT
SELECT @iDayofWeek = CASE @DayOfWeek
WHEN 'Sunday' THEN 1
WHEN 'Monday' THEN 2
WHEN 'Tuesday' THEN 3
WHEN 'Wednesday' THEN 4
WHEN 'Thursday' THEN 5
WHEN 'Friday' THEN 6
WHEN 'Saturday' THEN 7
END
RETURN (@iDayofWeek)
END
GO
Nun 6 Jahre später und mehrere Version von SQL Server aber es gibt noch keine integrierte Funktion, dies zu tun (soweit ich weiß). Nicht sicher, ob sql-server- getaggt 2014 wird dies etwas zu tun.
ich @RussBradberry ähnlichen Ansatz habe gerade mit IF
Aussagen gemacht.
CREATE FUNCTION dbo.WeekDayInt (@DayOfWeekName VARCHAR(10))
RETURNS INT
AS
BEGIN
DECLARE @DayWeekNumber INT
IF @DayOfWeekName = 'Sunday' SET @DayWeekNumber = 1
IF @DayOfWeekName = 'Monday' SET @DayWeekNumber = 2
IF @DayOfWeekName = 'Tuesday' SET @DayWeekNumber = 3
IF @DayOfWeekName = 'Wednesday' SET @DayWeekNumber = 4
IF @DayOfWeekName = 'Thursday' SET @DayWeekNumber = 5
IF @DayOfWeekName = 'Friday' SET @DayWeekNumber = 6
IF @DayOfWeekName = 'Saturday' SET @DayWeekNumber = 7;
RETURN (@DayWeekNumber)
END
oder als Alternative kann es auf diese Art und Weise erfolgen, die ein wenig schneller sein können, weil es Wert zurückgeben wird, sobald Übereinstimmung gefunden wird und nicht versuchen, andere Werte zu bewerten.
CREATE FUNCTION dbo.WeekDayInt (@DayOfWeekName VARCHAR(10))
RETURNS INT
AS
BEGIN
IF @DayOfWeekName = 'Sunday' RETURN 1
IF @DayOfWeekName = 'Monday' RETURN 2
IF @DayOfWeekName = 'Tuesday' RETURN 3
IF @DayOfWeekName = 'Wednesday' RETURN 4
IF @DayOfWeekName = 'Thursday' RETURN 5
IF @DayOfWeekName = 'Friday' RETURN 6
IF @DayOfWeekName = 'Saturday' RETURN 7;
RETURN 0;
END
Hier ist eine schmutzige Alternative, die ich benutze, wenn ich es nicht auf massive Daten-Set laufen bin.
Select CHARINDEX(SUBSTRING('Thursday',1,3), 'MONTUEWEDTHUFRISATSUN') / 3 + 1
Just ersetzen Donnerstag mit einem Tag Ihrer Wahl oder einer Variable.
Wie es funktioniert: SUBSTRING ( ‚Donnerstag‘, 1,3) im Grunde Do schafft, dann findet charindex in der Zeichenfolge, die die Position von thu aus, die 10 ist, dass wir dann 10 dividieren durch Länge unserer Tage Worte, die 3 ist die gleich 3 ist, und weil ich will
Montag bis gleich 1 Dienstag gleich 2 Mittwoch gleich 3 Donnerstag, 4. bis gleich
I 1 hinzufügen, bis zum Ende
so das Ergebnis ist 4.
Hoffnung, dass jemand hilft, aber ich stimme es wahrscheinlich nicht die beste Lösung ist.
Hinweis: Sie können auch ein Ergebnis Sortieren nach Tagesnummer festlegen, indem es wie so mit:
SELECT ID,DayNamesColumn from mytable ORDER BY CHARINDEX(SUBSTRING(DayNamesColumn ,1,3), 'MONTUEWEDTHUFRISATSUN') / 3 + 1
Sie können folgende Auswahl verwenden die ISO Wochentag Ordnungsdatum 2017-12-15
in Bezug auf (zum Beispiel unabhängig davon), um die aktuelle Einstellung von @@ datefirst zu erhalten, die den ersten Tag der Woche bestimmt. Z.B. set datefirst = 1 für Montag.
select
w.weekday_id_iso8601,
w.weekday_id_datepart,
w.weekday_name
from (
values
(7, 'Monday'),
(8, 'Tuesday'),
(9, 'Wednesday'),
(10, 'Thursday'),
(11, 'Friday'),
(12, 'Saturday'),
(13, 'Sunday'))
t(weekday_id, weekday_name)
cross apply (
select
t.weekday_id - 6 weekday_id_iso8601,
(t.weekday_id - @@datefirst + 1) % 7 + 1 weekday_id_datepart,
t.weekday_name
) w
where w.weekday_id_datepart = datepart(weekday, '2017-12-15')
Ich bin nicht einverstanden mit der Antwort über eine Lookup-Tabelle hinzugefügt, da in diesem Fall sind die Werte begrenzt und wird sich nie ändern. Die Lookup-Tabelle beitreten werden nur Kosten hinzu.
IMHO; da Sie begrenzte Werte haben, würde ich nur einen Fall Aussage in meinen Ansichten verwenden. Es ist nicht schön, aber es ist wahrscheinlich der schnellste Weg, es zu tun.
Das kann nicht einen praktischen Zweck dienen, aber ich dachte, dass ich es heraus würde nur zum Spaß aus. :) Die folgenden Arbeiten.
Beachten Sie, dass, wenn DATEPART oder DATENAME mit, dass der Wert von @@ DATEFIRST wichtig ist, und können Ihre Ergebnisse ändern. Sehen Sie SET DATEFIRST in der Online-Hilfe.
DECLARE
@date_name AS VARCHAR(20)
SET @date_name = 'Monday'
SELECT
DATEPART(dw, my_date)
FROM
(
SELECT CAST('1900-01-01' AS DATETIME) AS my_date UNION
SELECT CAST('1900-01-02' AS DATETIME) AS my_date UNION
SELECT CAST('1900-01-03' AS DATETIME) AS my_date UNION
SELECT CAST('1900-01-04' AS DATETIME) AS my_date UNION
SELECT CAST('1900-01-05' AS DATETIME) AS my_date UNION
SELECT CAST('1900-01-06' AS DATETIME) AS my_date UNION
SELECT CAST('1900-01-07' AS DATETIME) AS my_date
) AS My_Dates
WHERE
DATENAME(dw, my_date) = @date_name
Wo DayID
ist ganzzahliger Wert von 1 bis 7.
In DayID zu einem einig Basisdatum wie 1899.12.31. (Wenn Sonntag Der erste Tag der Woche ist dann mit Anfangsdatum 1899-12-30)
1900-01-01 war Montag, 1900.01.02 war Dienstag, und so weiter.
So:
select DayID,
datename( weekday, dateadd( day, DayID, '18991231' ) )
In SQL 2014 können Sie:
SELECT DATEPART (DW, GetDate ()) Dieser Tag der Woche als ganze Zahl zurück.