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ück

und 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?

War es hilfreich?

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 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top