{"id":401,"date":"2009-03-09T23:55:04","date_gmt":"2009-03-09T22:55:04","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=401"},"modified":"2009-03-10T13:57:28","modified_gmt":"2009-03-10T12:57:28","slug":"ms-sql-universelles-datumsformat","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2009\/03\/09\/ms-sql-universelles-datumsformat\/","title":{"rendered":"MS-SQL: Universelles Datumsformat"},"content":{"rendered":"<p>Datumsangaben in SQL Queries sind immer wieder eine Freude. Im Gegensatz zu allen anderen Datentypen hat man es hier auch noch mit einer sprachspezifischen Einstellung (US English, Deutsch etc.) zu tun.<br \/>\nAlso was macht der Entwickler, er schreibt SQL Code wie diesen, der die Funktion <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa226054(SQL.80).aspx\">CONVERT oder CAST<\/a> verwendet:<\/p>\n<pre lang=\"sql\">CREATE VIEW dbo.International_Dates AS\r\nSELECT PurchaseOrderID, TotalDue\r\nFROM AdventureWorks.Purchasing.PurchaseOrderHeader\r\nWHERE OrderDate &lt; CONVERT(DATETIME,'2002.05.01',102);<\/pre>\n<p>Man kann eben nicht sicher sein wie der Datumswert interpretiert wird. Das folgende Statement w\u00fcrde also nur mit einer englischen Locale funktionieren:<\/p>\n<pre lang=\"sql\">CREATE VIEW dbo.USA_Dates AS\r\nSELECT PurchaseOrderID, TotalDue\r\nFROM AdventureWorks.Purchasing.PurchaseOrderHeader\r\nWHERE OrderDate &lt; 'May 1, 2002';<\/pre>\n<p>Dabei gibt es ein Datmsformat im MS-SQL Server, dass immer gleich interpretiert wird, das so genannte <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms187085(SQL.90).aspx\">Unseparated String Format<\/a> . Netterweise geht das sogar f\u00fcr DateTime Werte wenn man diesen im Format <em>yyyyMMdd hh:mm:ss.ttt<\/em> angibt.<br \/>\nDies entspricht den CAST\/CONVERT Formaten 112 und 114!<\/p>\n<p >Man kann den obigen Query also komplett locale-unabh\u00e4ngig so schreiben.<\/p>\n<pre lang=\"sql\">CREATE VIEW dbo.Uniform_Date AS\r\nSELECT PurchaseOrderID, TotalDue\r\nFROM AdventureWorks.Purchasing.PurchaseOrderHeader\r\nWHERE OrderDate &lt; '20020501';<\/pre>\n<p>Man kann sich CAST und CONVERT also oft genug sparen wenn man Queries aufbaut, da Datum-Strings im Format <em>yyyyMMdd hh:mm:ss.ttt<\/em>, eben sprach\/localeunabh\u00e4ngig sind.<br \/>\nIch habe eine spezielle Funktion die genau dieses MS-SQL-Format benutzt um ein COleDateTime in das entsprechende Stringformat f\u00fcr einen SQL Query zu bringen, wenn ich mal keine Parameter in einem Query benutzen will oder kann.<\/p>\n<p>Nachtrag: es ist ohne Probleme m\u00f6glich die Uhrzeit auch abgek\u00fcrzt zu \u00fcbergeben, wie z.B. auch in der Form: <em>yyyyMMdd hh:mm<\/em>, oder <em>yyyyMMdd hh:mm:ss<\/em> \u2757 <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Datumsangaben in SQL Queries sind immer wieder eine Freude. Im Gegensatz zu allen anderen Datentypen hat man es hier auch noch mit einer sprachspezifischen Einstellung (US English, Deutsch etc.) zu tun. Also was macht der Entwickler, er schreibt SQL Code wie diesen, der die Funktion CONVERT oder CAST verwendet: CREATE VIEW dbo.International_Dates AS SELECT PurchaseOrderID, &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2009\/03\/09\/ms-sql-universelles-datumsformat\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eMS-SQL: Universelles Datumsformat\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[3,12,15],"tags":[159,359],"class_list":["post-401","post","type-post","status-publish","format-standard","hentry","category-programmieren","category-software","category-sql","tag-ms-sql","tag-sql"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/401","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=401"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/401\/revisions"}],"predecessor-version":[{"id":434,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/401\/revisions\/434"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=401"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}