{"id":639,"date":"2015-04-18T02:08:49","date_gmt":"2015-04-18T05:08:49","guid":{"rendered":"http:\/\/thesqltimes.com\/blog\/?p=639"},"modified":"2018-12-19T20:33:08","modified_gmt":"2018-12-19T23:33:08","slug":"sql-server-datas-e-horas-parte-3-tipos-de-dados","status":"publish","type":"post","link":"https:\/\/thesqltimes.com\/blog\/2015\/04\/18\/sql-server-datas-e-horas-parte-3-tipos-de-dados\/","title":{"rendered":"3. SQL Server, Datas e Horas: Tipos de dados"},"content":{"rendered":"<div class=\"pld-like-dislike-wrap pld-template-1\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"Muito \u00fatil!\" data-post-id=\"639\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                        <i class=\"fas fa-thumbs-up\"><\/i>\r\n                <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">    <\/span>\r\n<\/div><\/div><div class=\"seriesmeta\">Post 3\/3. Este post \u00e9 parte da s\u00e9rie: <a href=\"https:\/\/thesqltimes.com\/blog\/series\/sql-datas-basico\/\" class=\"series-124\" title=\"SQL Server: Esclarecendo Datas e Horas\">SQL Server: Esclarecendo Datas e Horas<\/a>\r\n<\/div>\r\n<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Tempo de Leitura:<\/span> <span class=\"rt-time\"> 2<\/span> <span class=\"rt-label rt-postfix\">minutos<\/span><\/span><p>Salve amigos!<\/p>\n<p>Data e hora no SQL Server pode parecer simples e f\u00e1cil, principalmente para aqueles que j\u00e1 possuem alguma experi\u00eancia, seja com administra\u00e7\u00e3o, seja com desenvolvimento. Entender os principais aspectos de data e hora ir\u00e3o permitir construir scripts melhores e eficientes, al\u00e9m de evitar inconsist\u00eancias ou surpresas nas aplica\u00e7\u00f5es.<\/p>\n<p>Para finalizar esta s\u00e9rie, vamos falar sobre os tipos de dado de data. At\u00e9 o SQL Server 2005 somente dois tipos existiam para trabalhar com data e hora: <a title=\"BOL - smalldatetime\" href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms182418.aspx\" target=\"_blank\">smalldatetime <\/a>e <a title=\"BOL - datetime\" href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms187819.aspx\" target=\"_blank\">datetime<\/a>. Estes sempre guardam a data e hora juntos. A partir do SQL Server 2008, mais alguns tipos surgiram: <a title=\"BOL - date\" href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/bb630352.aspx\" target=\"_blank\">date<\/a>, <a title=\"BOL - time\" href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/bb677243.aspx\" target=\"_blank\">time<\/a>, <a title=\"BOL - datetime2\" href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/bb677335.aspx\" target=\"_blank\">datetime2<\/a> e <a title=\"BOL - datetimeoffset\" href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/bb630289.aspx\" target=\"_blank\">datetimeoffset<\/a>. <strong>Date<\/strong> guarda somente data, gasta menos espa\u00e7o e abrange uma faixa muito maior. Se voc\u00ea precisar guardar data de anivers\u00e1rio, por\u00a0exemplo, ele \u00e9 muito melhor do que o <strong>datetime<\/strong>. \u00a0O tipo <strong>time<\/strong> guarda somente a parte das horas. Al\u00e9m de gastar menos, a precis\u00e3o das horas \u00e9 muito maior. Talvez voc\u00ea j\u00e1 tenha percebido isso: o <strong>datetime<\/strong> possui uma precis\u00e3o de cerca de 3,33 milissegundos apenas! Isto significa que&#8230; Bl\u00e1, bl\u00e1, bl\u00e1! \u00c9 melhor voc\u00ea ver na pr\u00e1tica:<\/p>\n<pre class=\"lang:tsql decode:true \" title=\"Precis\u00e3o causando 'arrendondamento'\">SELECT\r\n\tD.DataString\r\n\t,CONVERT(datetime,D.DataString) AS DataDatetime\r\nFROM\r\n(\r\n\tVALUES\r\n\t\t ('20150101 23:59:59.002')\r\n\t\t,('20150101 23:59:59.004')\r\n\t\t,('20150101 23:59:59.005')\r\n\t\t,('20150101 23:59:59.006')\r\n\t\t,('20150101 23:59:59.009')\r\n\t\t,('20150101 23:59:59.011')\r\n\t\t,('20150101 23:59:59.012')\r\n) D(DataString)<\/pre>\n<p>Tudo isso se deve ao formato como o <strong>datetime<\/strong> \u00e9 armazenado internamente (assunto pra um futuro\u00a0post). Mas o fato \u00e9 que isso \u00e9 uma realidade e tudo isso pode acontecer:<\/p>\n<pre class=\"lang:tsql decode:true \" title=\"Precis\u00e3o do datetime\">SELECT CONVERT(datetime,'20150101 23:59:59.002')\r\nSELECT CONVERT(datetime,'20150101 23:59:59.004')\r\nSELECT CONVERT(datetime,'20150101 23:59:59.005')\r\nSELECT CONVERT(datetime,'20150101 23:59:59.006')\r\nSELECT CONVERT(datetime,'20150101 23:59:59.009')\r\nSELECT CONVERT(datetime,'20150101 23:59:59.011')\r\nSELECT CONVERT(datetime,'20150101 23:59:59.012')<\/pre>\n<p>O tipo <strong>smalldatetime<\/strong>, tem uma precis\u00e3o de 1 minuto. A seguinte query mostra a diferen\u00e7a entre os tipos datetime e smalldatetime:<\/p>\n<pre class=\"lang:tsql decode:true \" title=\"Precis\u00f5es de smalldatetime e datetime\">SELECT\r\n\tD.DataString\r\n\t,CONVERT(smalldatetime,D.DataString) AS DataSmallDatetime\r\n\t,CONVERT(datetime,D.DataString) AS DataDatetime\r\nFROM\r\n(\r\n\tVALUES\r\n\t\t ('20150101 23:59:59')\r\n\t\t,('20150101 23:59:30')\r\n\t\t,('20150101 13:15:29')\r\n) D(DataString)<\/pre>\n<p>Executando a query acima (SQL 2008 ou superior, devido a cl\u00e1usula VALUES), voc\u00ea ir\u00e1 perceber que quando os segundos passam s\u00e3o 30 ou superior, a data \u00e9 arrendondada para o pr\u00f3ximo minuto, quando \u00e9 convertida para <strong>smalldatetime<\/strong>.<\/p>\n<p>J\u00e1 o tipo <strong>time<\/strong> tem uma precis\u00e3o de <strong>100 nanossegundos<\/strong>. O tipo <strong>time<\/strong> s\u00f3 armazena tempo, mas se voc\u00ea precisar armazenar data e hora com uma precis\u00e3o maior, voc\u00ea pode usar o tipo <strong>datetime2<\/strong>. Apesar do nome maluco, ele \u00e9 o tipo recomendando pela Microsoft por estas quest\u00f5es:<\/p>\n<pre class=\"lang:tsql decode:true \" title=\"Datetime2 e time: Precis\u00e3o maior\">SELECT CONVERT(datetime2,'20150101 23:59:59.998')\r\nSELECT CONVERT(datetime2,'20150101 23:59:59.999')\r\nSELECT CONVERT(datetime2,'20150101 23:59:59.002')\r\nSELECT CONVERT(datetime2,'20150101 23:59:59.004')\r\nSELECT CONVERT(datetime2,'20150101 23:59:59.005')\r\nSELECT CONVERT(datetime2,'20150101 23:59:59.006')\r\nSELECT CONVERT(datetime2,'20150101 23:59:59.009')\r\nSELECT CONVERT(datetime2,'20150101 23:59:59.011')\r\nSELECT CONVERT(datetime2,'20150101 23:59:59.012')\r\nSELECT CONVERT(time,'23:59:59.999')<\/pre>\n<p>Por padr\u00e3o, estes tipos exibem 7 casas para os milissegundos. Voc\u00ea pode alterar este valor (quanto menor, menos espa\u00e7o gasta). Voc\u00ea pode consultar\u00a0a <a title=\"BOL - time\" href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/bb677243.aspx\" target=\"_blank\">documenta\u00e7\u00e3o<\/a>\u00a0para mais informa\u00e7\u00f5es:<\/p>\n<pre class=\"lang:tsql decode:true\" title=\"Especificando a precis\u00e3o para time\">SELECT CONVERT(datetime2(3),'20150101 23:59:59.998')\r\nSELECT CONVERT(datetime2(3),'20150101 23:59:59.999')\r\nSELECT CONVERT(time(4),'23:59:59.999')\r\nSELECT CONVERT(time(1),'23:59:59.999')<\/pre>\n<p>O tipo <strong>datetimeoffset2<\/strong>, al\u00e9m de fazer tudo isso demonstrado acima, ele inclui informa\u00e7\u00f5es sobre o timezone. Para n\u00e3o ampliar o post, deixarei para falar dele depois. Lembre-se: Voc\u00ea pode obter muito mais informa\u00e7\u00f5es na documenta\u00e7\u00e3o do SQL Server. Acesse os links informados acima.<\/p>\n<p>Data e hora s\u00e3o extremamente \u00fateis e saber manipular dentro do SQL Server permite que voc\u00ea incremente suas solu\u00e7\u00f5es, melhore o desempenho e evite erros sem\u00e2nticos. Espero que este s\u00e9rie\u00a0possa ter esclarecido melhor. Qualquer coisa utilize os coment\u00e1rios!<\/p>\n<p>&#8230;<\/p>\n<p>Antes de finalizar, voc\u00ea sabe o que significa &#8220;Service Principal Name&#8221;? Aguarde os pr\u00f3ximos posts&#8230;<\/p>\n<p>&nbsp;<\/p>\n[]&#8217;s<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">This entry is part 3 of 3 in the series <a href=\"https:\/\/thesqltimes.com\/blog\/series\/sql-datas-basico\/\" class=\"series-124\" title=\"SQL Server: Esclarecendo Datas e Horas\">SQL Server: Esclarecendo Datas e Horas<\/a><\/div><p>Salve amigos! Data e hora no SQL Server pode parecer simples e f\u00e1cil, principalmente para aqueles que j\u00e1 possuem alguma experi\u00eancia, seja com administra\u00e7\u00e3o, seja com desenvolvimento. Entender os principais aspectos de data e hora ir\u00e3o permitir construir scripts melhores e eficientes, al\u00e9m de evitar inconsist\u00eancias ou surpresas nas aplica\u00e7\u00f5es. Para finalizar esta s\u00e9rie, vamos&hellip;&nbsp;<a href=\"https:\/\/thesqltimes.com\/blog\/2015\/04\/18\/sql-server-datas-e-horas-parte-3-tipos-de-dados\/\" rel=\"bookmark\"><span class=\"screen-reader-text\">3. SQL Server, Datas e Horas: Tipos de dados<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[11,7,1],"tags":[134,125,126,129,130,142,128,73,74,127],"series":[124],"class_list":["post-639","post","type-post","status-publish","format-standard","hentry","category-desenvolvimento","category-sql-server","category-uncategorized","tag-datas","tag-date","tag-datetime","tag-datetime2","tag-datetimeoffset","tag-espaco","tag-precisao","tag-sql-server","tag-sql-server-2008","tag-time","series-sql-datas-basico"],"_links":{"self":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/639","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/comments?post=639"}],"version-history":[{"count":6,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/639\/revisions"}],"predecessor-version":[{"id":963,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/639\/revisions\/963"}],"wp:attachment":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media?parent=639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/categories?post=639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/tags?post=639"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/series?post=639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}