Announcement

Collapse
No announcement yet.

Datumsformat im SQL Server ändern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datumsformat im SQL Server ändern

    Hallo!

    Ich würde gerne wissen, ob es irgendwie möglich ist, dass Datumsformat zu ändern, was der SQL Server bei Vergleichen mit Datetime erwartet.

    Sprich, bei einem deutschen SQL Server funktioniert folgende Abfrage:

    SELECT * FROM Tabelle
    WHERE Zeit = '07.01.2013 12:00:00'

    Installiert man aber einen amerikanischen SQL Server, gibt es bei dieser Abfrage den Fehler, dass er den varchar Wert nicht nach datetime konvertieren kann. Ich würde den amerikanischen Server gerne so umstellen, dass die oben angegebene Anfrage funktioniert, wie geht das?

    Danke!

    PS: Ich weiß, dass es ein globales SQL Datumsformat gibt, aber in diesem Fall gibt der Kunde sozusagen die Abfrage ein und dieser würde gerne das für seine Region gängige Format benutzen, egal woher er den SQL Server hat.

  • #2
    Originally posted by Rya View Post
    , aber in diesem Fall gibt der Kunde sozusagen die Abfrage ein und dieser würde gerne das für seine Region gängige Format benutzen, egal woher er den SQL Server hat.
    Gegenfrage, was macht denn der Kunde bzw. seine Mitarbeiter mit so einer Umsetzung, wenn eine Zweigstelle in einer anderen "Region" eröffnet wird?
    Gruß, defo

    Comment


    • #3
      Gleich die Servereinstellungen zu ändern ist sicher nicht geschickt. Ich würde vorschlagen die Standardsprache der betroffenen User auf 'German' zu ändern..
      Entweder via Management Studio oder via SQL

      [HIGHLIGHT=SQL]ALTER LOGIN meinLieberUserName WITH DEFAULT_LANGUAGE = German[/HIGHLIGHT]

      Comment


      • #4
        Angenommen es gäbe keine implizite Datumskonvertierung, wären wahrscheinlich 2/3 aller Programmierer arbeitslos und 2/3 der Anwender glücklicher.

        Mein Vorschlag:
        1. Eingabe des Datums via DateTimePicker oder definierter Daumts Edit Maske in Regionsabhängigem Format (Siehe Betriebssystem) und Speicherung als Variable vom Typ "Date"
        2. Erzeugung einer Abfrage, deren fragliches Datumsfeld per Parameter vom Typ Date ist.
        3. Übergabe von Variable aus 1. an Parameter aus 2. (ohne irgendwelchen Konvertierungsfirlefanz)
        4. Abfrage starten und sich gewiss sein, dass es überall auf der Welt mit jeder Server Lokalisierung funktioniert.
        Gruß, defo

        Comment


        • #5
          So etwas würde ich produktiv einfach nicht verwenden. Solche Konvertierungen gehören für meinen Geschmack immer explizit über einen Format String gemacht. Am Ende gehts noch soweit dass sich die DB die Ländereinstellungen aus den Windows Einstellungen holt und irgendwer die Serversprache umstellt. Viel Spaß beim Suchen!

          Comment


          • #6
            Ich mag da ein Detail zuviel gesehen haben aber Rya sprach davon das der User die Abfrage eingibt nicht das der User Daten eingibt aus der eine Abfrage erstellt wird.

            Comment


            • #7
              Originally posted by Ralf Jansen View Post
              Ich mag da ein Detail zuviel gesehen haben aber Rya sprach davon das der User die Abfrage eingibt nicht das der User Daten eingibt aus der eine Abfrage erstellt wird.
              Ops mal wieder nur die Hälfte gelesen. Glaube Du hast recht

              Comment


              • #8
                Originally posted by Ralf Jansen View Post
                Ich mag da ein Detail zuviel gesehen haben aber Rya sprach davon das der User die Abfrage eingibt nicht das der User Daten eingibt aus der eine Abfrage erstellt wird.
                Der geringste Aufwand wäre bei einer Freitextabfrage, wenn es wirklich so gemeint ist, soetwas zu verwenden
                [highlight=SQL]
                ..where myDateField between to_char('15.11.2011 17:18', 'DD.MM.YYYY HH24:MI')
                and to_char('15.12.2011 17:17', 'DD.MM.YYYY HH24:MI')
                ..
                [/highlight]
                to_char ist die notwendige Oracle Function mit der entsprechenden Formatmaske, in MS SQL Server weiß ich das nicht auswendig.
                Der Anwender hat alle Freiheiten und kann das notwendige Format auch nach belieben einkürzen, noch 1,2,3 Buttons dazu, die ein paar Defaults oder ein Custom Konvert String in den Abfragewert pasten und man hat alles was man braucht.
                Gruß, defo

                Comment


                • #9
                  Im SQL Server wäre die Entsprechung

                  [HIGHLIGHT=SQL]Convert(datetime,'15.11.2011 17:18', 104)[/HIGHLIGHT]

                  das kann man dann in eine simple Stored Function packen um sich das drum rum zu erleichtern

                  [HIGHLIGHT=SQL]CREATE FUNCTION ufn_date(@Value varchar(32)) RETURNS datetime AS
                  BEGIN
                  RETURN Convert(datetime, @Value, 104)
                  END

                  SELECT * FROM Tabelle WHERE Zeit = dbo.ufn_date('07.01.2013 12:00:00')[/HIGHLIGHT]

                  Comment


                  • #10
                    Die Stored Procedure finde ich eine gute Idee. Da ist transparent was passiert und es hängt nicht von irgendwelchen ominösen Servereinstellungen ab

                    Comment


                    • #11
                      Danke für die Antworten, aber ich will wirklich im SQL Server das erwartete Format ändern.

                      Funktionen und Konvertierungen innerhalb vom Program kann ich locker selbst schreiben, da müsste ich hier nicht fragen. In diesem Fall ist wirklich das Problem, dass der String vom User kommt. Und wenn dem User es zu unbequem ist, das Standardformat bzw. amerikanische Format zu nehmen, könnt ihr euch sicherlich vorstellen, dass er das Datum auch nicht innerhalb eines Funktionsaufrufs packen will.
                      Langfristig werd ich sicherlich einen eigenen Konverter dafür schreiben, aber ich brauch jetzt erst einmal eine kurzfristige Lösung.

                      Ich kann sicherstellen, dass es pro Standort immer einen eigenen SQL Server gibt, daher ist das kein Problem.

                      Die Abfrage muss also exakt so sein wie ich oben geschrieben habe und soll einfach keinen Fehler werfen bei einem US SQL Server.

                      ALTER LOGIN meinLieberUserName WITH DEFAULT_LANGUAGE = German
                      Oh cool, pro DB Login kann man das einstellen? Und das ändert auch wirklich, wie er das Datumsformat interpretiert? Aber man gibt ja nur die Sprache an und nicht das Land. Wie unterscheidet er z.B. zwischen US-EN und GB-EN?

                      Comment


                      • #12
                        British ist english und Englisch ist amerikanisch Schau mal in sys.syslanguages.

                        Comment


                        • #13
                          Ah cool, es funktioniert! Genau das was ich gesucht habe. Danke. :-)

                          Comment

                          Working...
                          X