Question

Dans SQL Server, vous pouvez utiliser la fonction DATENAME pour obtenir le jour de la semaine sous forme de chaîne

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

qui retourne "mardi"

et vous pouvez utiliser la fonction DATEPART pour obtenir le jour de la semaine comme un entier

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

Ce qui renvoie 3

Mais que j'ai un varchar qui contient la chaîne « mardi » et je veux le convertir à sa représentation entière de 3. Bien sûr, je pourrais écrire la conversion sans trop de tracas, mais j'utiliser beaucoup mieux intégré -en fonction. Est-ce que cette fonction existe?

Était-ce utile?

La solution

Au lieu d'écrire une fonction, vous devez créer un jour de la table de semaine avec la description et la valeur numérique. vous pouvez simplement rejoindre à THEN la table pour obtenir le numérique.

Et si vous avez des jours stockés plusieurs façons (probablement dans un système characterbased), vous pouvez mettre toutes les variantes dans la table, donc mar., MAR., mardi serait toute carte au même entier.

Autres conseils

malheureusement il n'y a pas construit en fonction, mais vous pouvez créer votre propre comme ceci:


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

Eh bien 6 ans plus tard et plusieurs versions de SQL Server, mais il n'y a toujours pas fonction intégrée pour le faire (pour autant que je sache). Je ne sais pas si sera quelque chose à faire.

Je pris approche similaire à @RussBradberry juste de faire des déclarations de 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

ou alternative, il peut se faire de cette façon, qui peut être un peu plus vite, car il sera de retour valeur dès match rencontré et ne pas essayer d'évaluer d'autres valeurs.

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

Voici une alternative sale que j'utilise si je ne suis pas en cours d'exécution sur énorme somme de données.

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

Il suffit de remplacer jeudi avec un jour de votre choix ou une variable.

Comment ça marche: SUBSTRING ( « jeudi », 1,3) crée essentiellement jeu, CHARINDEX trouve la position de jeu. dans la chaîne qui est 10. On divise ensuite 10 par la longueur de nos mots de jour, ce qui est 3 qui est égal à 3, et parce que je veux

Du lundi au 1 égal Mardi 2 à égal Mercredi à l'égalité 3 Jeudi pour égaler 4

ajouter 1 à la fin

de sorte que le résultat est 4.

L'espoir qui aide quelqu'un, mais je suis d'accord, il est sans doute pas la meilleure solution.

Remarque: Vous pouvez également commander un jeu de résultats par numéro de jour en utilisant comme ceci:

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

Vous pouvez utiliser ce qui suit, sélectionnez pour obtenir le ordinale iso semaine de la date 2017-12-15 par rapport à (par exemple quel que soit) le réglage actuel de @@ datefirst qui détermine le premier jour de la semaine. Par exemple. définir datefirst = 1 pour lundi.

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

Je suis en désaccord avec la réponse sur l'ajout d'une table de consultation, puisque dans ce cas, les valeurs sont limitées et ne changeront jamais. La table de consultation join simplement ajouter des coûts.

IMHO; puisque vous avez des valeurs limitées, je voudrais simplement utiliser une déclaration de cas dans mon point de vue. Ce n'est pas assez, mais il est probablement le meilleur moyen de le faire.

Cela peut ne pas servir un but pratique, mais je pensais que je le découvrir juste pour le plaisir. :) Les travaux suivants.

Souvenez-vous que lors de l'utilisation DATEPART ou DATENAME que la valeur de @@ DATEFIRST est important et peut changer vos résultats. Consulter SET DATEFIRST dans l'aide en ligne.

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

DayID est une valeur entière de 1 à 7.

Ajouter DayID à une certaine date de base telle que 31/12/1899. (Si dimanche est le premier jour de la semaine, puis utiliser la date initiale de 1899-12-30)

  

1900-01-01 était lundi, 02/01/1900 était mardi, et ainsi de suite.

Ainsi:

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

Dans SQL 2014, vous pouvez utiliser:

SELECT DATEPART (DW, GetDate ()) Ce sera de retour jour de la semaine en entier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top