{"id":9150,"date":"2018-07-10T10:41:40","date_gmt":"2018-07-10T13:41:40","guid":{"rendered":"http:\/\/www.fabriciolima.net\/?p=9150"},"modified":"2018-07-14T16:48:50","modified_gmt":"2018-07-14T19:48:50","slug":"azure-sql-database-funcao-getdate-com-valor-errado-no-azure-e-isso-mesmo","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2018\/07\/10\/azure-sql-database-funcao-getdate-com-valor-errado-no-azure-e-isso-mesmo\/","title":{"rendered":"Azure SQL Database &#8211; Fun\u00e7\u00e3o getdate() com valor errado no Azure. \u00c9 isso mesmo?"},"content":{"rendered":"<p>Fala Pessoal,<\/p>\n<p>Finalmente temos um cliente onde realizamos um suporte e monitoramento mensal indo para o Azure, ou seja, muitos posts para voc\u00eas com experi\u00eancias e casos do Dia a Dia que vivenciaremos no Azure SQL database.<\/p>\n<p>Ser\u00e3o desde dicas mais simples como essa de hoje at\u00e9 dicas mais complexas como rotinas de ADM que ainda precisamos executar no Azure.<\/p>\n<p>Como criar uma base no Azure voc\u00eas podem ver nesse post do Tiago Neves abaixo:<\/p>\n<p><a href=\"https:\/\/www.tiagoneves.net\/blog\/criando-um-banco-de-dados-sqldatabase\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.tiagoneves.net\/blog\/criando-um-banco-de-dados-sqldatabase\/<\/a><\/p>\n<p>Ap\u00f3s criar uma base e conectar, executei o t\u00e3o utilizado comando <strong>select getdate()<\/strong> e o bendito vem um valor diferente do nosso hor\u00e1rio de Bras\u00edlia. Vixe!<\/p>\n<p>No meu caso aqui em Vit\u00f3ria-ES, o Azure fica 3 horas adiantado do meu hor\u00e1rio local.<\/p>\n<p><strong>Mas Fabr\u00edcio, e se eu criar a minha base no Datacenter do Brasil, isso tamb\u00e9m acontece?<\/strong><\/p>\n<p>R: Sim. Mesma coisa.<\/p>\n<p>O servi\u00e7o de banco de dados do Azure (Paas), sempre utiliza o UTC como time zone para suas bases, dessa forma voc\u00ea consegue mudar uma base entre data centers de diferentes continentes sem ter que mudar nada com rela\u00e7\u00e3o a datas no seu banco.<\/p>\n<p><strong>Entendi Fabr\u00edcio. Mas a solu\u00e7\u00e3o \u00e9 f\u00e1cil ent\u00e3o. Coloco um dateadd -3 horas no getdate e est\u00e1 resolvido.<\/strong><\/p>\n<p>Gambiarra! E o hor\u00e1rio de ver\u00e3o?<\/p>\n<p><strong>Verdade Fabr\u00edcio. Como fa\u00e7o ent\u00e3o?<\/strong><\/p>\n<p>Quando fizer uma busca no google, vai achar algu\u00e9m falando da utiliza\u00e7\u00e3o do comando &#8220;AT TIME ZONE&#8221; junto com o seu Getdate().<\/p>\n<p>Exemplo:<\/p>\n<pre class=\"lang:tsql decode:true \">SELECT GETDATE() AT TIME ZONE 'Central European Standard Time'<\/pre>\n<p>Resultado: 2018-07-05 18:29:43.613 +02:00<\/p>\n<p><strong>Massa Fabr\u00edcio. Como sei qual \u00e9 o meu time zone?<\/strong><\/p>\n<p>Com esse comando PowerShell pegamos:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9160\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-powershell.png\" alt=\"\" width=\"514\" height=\"192\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-powershell.png 514w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-powershell-300x112.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-powershell-410x153.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-powershell-100x37.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-powershell-275x103.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-powershell-20x7.png 20w\" sizes=\"auto, (max-width: 514px) 100vw, 514px\" \/><\/p>\n<p>Podemos procurar se ele existe no azure na query abaixo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9159\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-SQL.png\" alt=\"\" width=\"545\" height=\"188\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-SQL.png 545w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-SQL-300x103.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-SQL-410x141.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-SQL-100x34.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-SQL-275x95.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/timezone-SQL-20x7.png 20w\" sizes=\"auto, (max-width: 545px) 100vw, 545px\" \/><\/p>\n<p><strong>*is_currently_dst<\/strong> &#8211; True se atualmente observando o hor\u00e1rio de ver\u00e3o.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Certo Fabr\u00edcio. Ent\u00e3o \u00e9 s\u00f3 usar o getdate() conforme abaixo que meu problema est\u00e1 resolvido.<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9158\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-AT-time-zone.png\" alt=\"\" width=\"854\" height=\"144\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-AT-time-zone.png 913w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-AT-time-zone-300x51.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-AT-time-zone-768x130.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-AT-time-zone-700x118.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-AT-time-zone-410x69.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-AT-time-zone-100x17.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-AT-time-zone-275x46.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-AT-time-zone-20x3.png 20w\" sizes=\"auto, (max-width: 854px) 100vw, 854px\" \/><\/p>\n<p>Ops. Deu ruim. A hora continua vindo 3 horas adiantada do meu hor\u00e1rio local, que nesse momento da execu\u00e7\u00e3o era <strong>15h36min<\/strong>.<\/p>\n<p><strong>E agora? Escolhi o Time Zone errado?<\/strong><\/p>\n<p>N\u00e3o. \u00c9 um pouco confuso, mas temos que transformar o getdate() para o formato datetimeoffset primeiro antes de convert\u00ea-lo para o nosso time zone.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9157\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-correto.png\" alt=\"\" width=\"1103\" height=\"132\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-correto.png 1187w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-correto-300x36.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-correto-1024x123.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-correto-768x92.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-correto-700x84.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-correto-410x49.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-correto-100x12.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-correto-275x33.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/Getdate-correto-20x2.png 20w\" sizes=\"auto, (max-width: 1103px) 100vw, 1103px\" \/><\/p>\n<p><strong>Agora sim a hora est\u00e1 correta!!! YES!!!<\/strong><\/p>\n<p>Voc\u00ea tem uma segunda op\u00e7\u00e3o de rodar direto o comando SYSDATETIMEOFFSET() e converter para o nosso Time Zone:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9156\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/sysdatetimeoffset.png\" alt=\"\" width=\"863\" height=\"127\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/sysdatetimeoffset.png 1047w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/sysdatetimeoffset-300x44.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/sysdatetimeoffset-1024x151.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/sysdatetimeoffset-768x113.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/sysdatetimeoffset-700x103.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/sysdatetimeoffset-410x60.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/sysdatetimeoffset-100x15.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/sysdatetimeoffset-275x40.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/sysdatetimeoffset-20x3.png 20w\" sizes=\"auto, (max-width: 863px) 100vw, 863px\" \/><\/p>\n<p>Pronto.<\/p>\n<p>Agora voc\u00ea pode criar sua pr\u00f3pria fun\u00e7\u00e3o de getdate() e dar aquele replace em todas as views, procedures, default constraints e functions quando for criar esses objetos no Azure.<\/p>\n<pre class=\"lang:tsql decode:true \">CREATE FUNCTION dbo.getdate2()\r\nRETURNS datetime\r\nWITH SCHEMABINDING\r\nAS\r\nbegin\r\nDECLARE @getdate datetime\r\nSET @getdate = SYSDATETIMEOFFSET() AT TIME ZONE 'E. South America Standard Time'\r\nRETURN @getdate\r\nend<\/pre>\n<p>A fun\u00e7\u00e3o pode ser usada dessa forma:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"529\" height=\"188\" class=\"alignnone size-full wp-image-9155\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/funcaogetdate.png\" alt=\"\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/funcaogetdate.png 529w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/funcaogetdate-300x107.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/funcaogetdate-410x146.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/funcaogetdate-100x36.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/funcaogetdate-275x98.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/funcaogetdate-20x7.png 20w\" sizes=\"auto, (max-width: 529px) 100vw, 529px\" \/><\/p>\n<p>Meu hor\u00e1rio correto e <strong>16h14min<\/strong> no momento dessa execu\u00e7\u00e3o.<\/p>\n<p>\u00c9 isso a\u00ed pessoal.<\/p>\n<p>At\u00e9 a pr\u00f3xima dica de como utilizar o Azure SQL Database no seu dia a dia de trabalho.<\/p>\n<p>Abra\u00e7os,<\/p>\n<p>Fabr\u00edcio Lima<\/p>\n<p>Microsoft Data Platform MVP<\/p>\n<p>Consultor e Instrutor SQL Server<\/p>\n<p>Trabalha com SQL Server desde 2006<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fala Pessoal, Finalmente temos um cliente onde realizamos um suporte e monitoramento mensal indo para o Azure, ou seja, muitos posts para voc\u00eas com experi\u00eancias e casos do Dia a Dia que vivenciaremos no Azure SQL database. Ser\u00e3o desde dicas mais simples como essa de hoje at\u00e9 dicas mais complexas como rotinas de ADM que [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[1616,1617,280],"tags":[],"class_list":["post-9150","post","type-post","status-publish","format-standard","hentry","category-azure-sql-database","category-managed-instance","category-virtual-pass-br"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/9150","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/comments?post=9150"}],"version-history":[{"count":9,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/9150\/revisions"}],"predecessor-version":[{"id":9213,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/9150\/revisions\/9213"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=9150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=9150"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=9150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}