Domanda

In SQL Server è possibile utilizzare la funzione di DATENAME per ottenere il giorno della settimana sotto forma di stringa

declare @date datetime
set @date = '12/16/08'
select datename(dw, @date)

che restituisce "Martedì"

ed è possibile utilizzare la funzione DATEPART per ottenere il giorno della settimana come intero

declare @date datetime
set @date = '12/16/08'
select datepart(dw, @date)

che restituisce 3

Ma dire che ho un varchar che contiene la stringa "Martedì" e voglio convertirlo in sua rappresentazione intero di 3. Certo, avrei potuto scrivere la conversione senza più problemi, ma mi piacerebbe molto piuttosto utilizzare un built -in funzione. Ha una tale funzione esiste?

È stato utile?

Soluzione

Invece di scrivere una funzione, è necessario creare un giorno della tavola settimana con la descrizione e il valore numerico. Allora si può semplicemente aderire al tavolo per ottenere la numerico.

E se avete memorizzato giorni diversi modi (probabilmente in un sistema characterbased), è possibile inserire tutte le varianti nella tabella, in modo da TUE, mar, Martedì sarebbero tutti mappa per lo stesso numero intero.

Altri suggerimenti

purtroppo non c'è un costruito in funzione, ma è possibile creare il proprio in questo modo:


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

Bene 6 anni più tardi e alcuni versione di SQL Server, ma non ancora alcuna funzione incorporata per fare questo (per quanto ne so). Non sono sicuro se avrà qualcosa a che fare questo.

Ho preso approccio simile a @RussBradberry appena fatto con le dichiarazioni IF.

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

o in alternativa si può fare in questo modo, che può essere un po 'più veloce, perché tornerà valore non appena si incontra partita e non cercare di valutare altri valori.

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

Ecco un alternativa sporca che uso se non sono in esecuzione su enorme insieme di dati.

    Select CHARINDEX(SUBSTRING('Thursday',1,3), 'MONTUEWEDTHUFRISATSUN') / 3 + 1

Basta sostituire Giovedi con una giornata di vostra scelta o una variabile.

Come funziona: SUBSTRING ( 'Giovedi', 1,3) crea sostanzialmente gio, quindi charindex scopre la posizione di Thu nella stringa, che è 10. Abbiamo poi dividiamo 10 per la lunghezza delle nostre parole al giorno, che è 3, che è uguale a 3, e perché voglio

Lunedi a uguale a 1 Martedì a uguale a 2 Mercoledì alla parità di 3 Giovedi a eguagliare 4

aggiungo 1 alla fine

in modo che il risultato è 4.

La speranza che aiuta qualcuno, ma sono d'accordo che probabilmente non è la soluzione migliore.

Nota: È inoltre possibile ordinare un set di risultati dal numero del giorno, utilizzando in questo modo:

SELECT ID,DayNamesColumn from mytable ORDER BY CHARINDEX(SUBSTRING(DayNamesColumn ,1,3), 'MONTUEWEDTHUFRISATSUN') / 3 + 1

È possibile utilizzare il seguente selezionare per ottenere il numero ordinale iso giorno della settimana della data 2017-12-15 rispetto a (ad esempio a prescindere) l'impostazione corrente del @@ DATEFIRST che determina il primo giorno della settimana. Per esempio. set DATEFIRST = 1 per lunedi.

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')

Non sono d'accordo con la risposta di aggiungere una tabella di ricerca, dal momento che in questo caso, i valori sono limitati e non cambieranno mai. La tabella di ricerca join sarà solo aggiungere costi.

IMHO; dal momento che si dispone di valori limitati, vorrei solo usare una dichiarazione caso le mie opinioni. Non è bello, ma è probabilmente il modo più veloce per farlo.

Questo non può servire uno scopo pratico, ma ho pensato di capirlo solo per divertimento. :) Le seguenti opere.

Ricordate che quando si utilizza DATEPART o DATENAME che il valore di @@ DATEFIRST è importante e può cambiare i risultati. Look up SET DATEFIRST nella guida in linea.

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

Dove DayID è un valore intero 1 thru 7.

Aggiungi DayID ad una data certa base come 1899/12/31. (Se Domenica è il primo giorno della settimana quindi utilizzare la data iniziale del 1899-12-30)

  

1900-01-01 era Lunedi, 1900-01-02 era Martedì, e così via.

Quindi:

select DayID, 
       datename( weekday, dateadd( day, DayID, '18991231' ) ) 

In SQL 2014, è possibile utilizzare:

Seleziona DATEPART (DW, GetDate ()) Questo restituirà giorno della settimana come intero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top