{"id":616,"date":"2015-03-28T18:06:53","date_gmt":"2015-03-28T21:06:53","guid":{"rendered":"http:\/\/thesqltimes.com\/blog\/?p=616"},"modified":"2018-12-19T20:32:57","modified_gmt":"2018-12-19T23:32:57","slug":"sql-datas-parte2","status":"publish","type":"post","link":"https:\/\/thesqltimes.com\/blog\/2015\/03\/28\/sql-datas-parte2\/","title":{"rendered":"2. SQL Server, Datas e Horas: Exibi\u00e7\u00e3o e Convers\u00f5es"},"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=\"616\" 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 2\/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\"> 6<\/span> <span class=\"rt-label rt-postfix\">minutos<\/span><\/span><p>Ol\u00e1!\u00a0<a title=\"SQL Server, Datas e Horas\" href=\"http:\/\/thesqltimes.com\/blog\/2015\/03\/14\/sql-datas-parte1\/\">No \u00faltimo post<\/a>, focamos em como o SQL Server entende as datas que enviamos no c\u00f3digo T-SQL. Para resumir: Especificar datas no SQL Server \u00e9 como especificar uma string qualquer, por\u00e9m com um formato espec\u00edfico.\u00a0Voc\u00ea pode usar o DATEFORMAT para auxiliar na interpreta\u00e7\u00e3o do SQL Server (e n\u00e3o como a data \u00e9 exibida) ou usar formatos gen\u00e9ricos, como o ISO.\u00a0Bom, agora vamos falar sobre a exibi\u00e7\u00e3o das datas, ou seja, o formato de sa\u00edda!<\/p>\n<p>Vamos come\u00e7ar alinhando um ponto: O SQL Server n\u00e3o exibe nada! Ele <strong>entrega<\/strong> data \u00e0 alguma aplica\u00e7\u00e3o (algum driver de conex\u00e3o como jTDS, ODBC,OLEDB, etc.). Internamente, uma data \u00e9 bem diferente do formato como especificamos. A <span style=\"color: #ff6600;\"><strong>data n\u00e3o \u00e9 armazenada como texto<\/strong><\/span>. \u00c9 um formato bin\u00e1rio bem diferente: imagine que seja um n\u00famero muito louco que de alguma forma contenha os dias, meses, anos, hora, etc. (prometo um post sobre isso em breve). Ao efetuar um SELECT que retorne uma coluna com algum, por exemplo, datetime, o SQL Server n\u00e3o entrega uma string para a aplica\u00e7\u00e3o. Ele entrega este n\u00famero (bin\u00e1rio). A aplica\u00e7\u00e3o \u00e9 respons\u00e1vel por interpretar este valor e exibi-lo da forma correta, ou seja, a aplica\u00e7\u00e3o tamb\u00e9m entende onde est\u00e1 o dia, m\u00eas, ano e hor\u00e1rio nesse n\u00famero. (O excel tamb\u00e9m trabalha de forma parecida. Experimente digitar este valor\u00a042071,1588859 e formatar a c\u00e9lula como data&#8230;)<\/p>\n<p>No caso do Management Studio (SSMS), quando voc\u00ea visualiza os resultado em um GRID (padr\u00e3o), ele vai exibir as datas no formato &#8216;YYYY-MM-AA HH:MM:SS.mmm&#8217;. Dependendo do tipo de dado (date, time, datetime2, etc.) ele vai omitir a data ou o hor\u00e1rio. Perceba (execute no SSMS):<\/p>\n<pre class=\"lang:tsql decode:true\" title=\"Formatos de diferentes Tipos\">SELECT CONVERT(datetime,'20150328 15:02');\r\nSELECT CONVERT(date,'20150328 15:02');<\/pre>\n<p>A quest\u00e3o aqui \u00e9: <span style=\"color: #ff6600;\"><strong>a aplica\u00e7\u00e3o \u00e9 a verdadeira respons\u00e1vel por exibir a data em um formato mais apropriado.<\/strong><\/span><\/p>\n<p>Caso voc\u00ea n\u00e3o queria que a aplica\u00e7\u00e3o fa\u00e7a estre trabalho voc\u00ea pode for\u00e7ar o SQL Server a entregar uma data como uma string, ao inv\u00e9s deste\u00a0n\u00famero bin\u00e1rio maluco&#8230; Em outras palavras, voc\u00ea pode converter uma data para uma string.\u00a0Bom aqui cabe deixar uma coisa clara: quando voc\u00ea converte uma data para string, aquela data perde seus poderes m\u00e1gicos: comparar com outras datas, adicionar datas, subtrair, ordenar. A data convertida passa a ser tratada como texto puro e perde certos comportamentos exclusivos de data. Se sua aplica\u00e7\u00e3o n\u00e3o vai precisar realizar nenhum processamento extra com aquela data e se o seu objetivo \u00e9 apenas exibi\u00e7\u00e3o, ent\u00e3o n\u00e3o h\u00e1 problemas!\u00a0<span style=\"line-height: 1.5;\">Observe os exemplos a seguir para entender melhor.\u00a0<\/span>Para converter uma data para string voc\u00ea usa a fun\u00e7\u00e3o CONVERT. Ela permite que voc\u00ea especifique um par\u00e2metro especial chamado Style (A fun\u00e7\u00e3o CAST tamb\u00e9m pode ser usada, mas n\u00e3o permite especificar o Style). O Style \u00e9 um n\u00famero pr\u00e9-determinado que faz com que o resultado da convers\u00e3o saia em um formato espec\u00edfico. A sintaxe geral \u00e9:<\/p>\n<p style=\"padding-left: 30px;\"><em>CONVERT(varchar(tamanho), \u00a0ValorData, Style)<\/em><\/p>\n<p>Primeiro, voc\u00ea deve estar\u00a0atento ao tamanho da string (pode ser <em>varchar<\/em> ou <em>char<\/em>) que ir\u00e1 receber\u00a0o resultado. Se o seu objetivo \u00e9 converter a data para o formato dd\/MM\/AAAA ent\u00e3o voc\u00ea vai precisar de 2 caracteres para o dia, 2 para o m\u00eas, 4 para o ano e mais 2 para as barras, totalizando 10 caracteres. Mas se voc\u00ea quiser incluir as horas e minutos (dd\/MM\/AAAA HH:MM) ent\u00e3o, al\u00e9m dos 10, voc\u00ea vai precisar de 1 para espa\u00e7o, 2 para as horas, 1 para os dois-pontos e 2 para os minutos, isto \u00e9, mais 6 caracteres, o que faz necess\u00e1rio 16 caracteres para a data inteira. Ent\u00e3o fique atento a isso para colocar o tamanho correto, ou voc\u00ea ir\u00e1 ver sua data cortada&#8230; O <em>Style<\/em> \u00e9 um valor fixo e pr\u00e9-determinado que voc\u00ea pode encontrar <a title=\"CAST and CONVERT - Books Online\" href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms187928(v=sql.120).aspx\">aqui na documenta\u00e7\u00e3o desta fun\u00e7\u00e3o<\/a>. <em>ValorData<\/em> pode ser qualquer coisa que seja uma data. Em outras palavras, <em>ValorData<\/em> pode ser qualquer express\u00e3o que resulte em um tipo de data: fun\u00e7\u00f5es de sistema (DATEADD,CURRENT_TIMESTAMP, etc.), fun\u00e7\u00f5es de usu\u00e1rio, nomes de vari\u00e1vel, nomes de colunas, etc. Bom, \u00a0a documenta\u00e7\u00e3o \u00e9 sua melhor fonte. <a title=\"SQL Server Helper - Tips and Tricks - Dateformats\" href=\"http:\/\/www.sql-server-helper.com\/tips\/date-formats.aspx\">Este site<\/a> tamb\u00e9m cont\u00e9m uma s\u00e9rie de exemplos de uso da fun\u00e7\u00e3o e ir\u00e1 te ajudar quando precisar de uma resposta r\u00e1pida. No mais, alguns exemplos:<\/p>\n<pre class=\"lang:tsql decode:true\" title=\"CONVERTs e DATEFORMATs\">DECLARE\r\n\t@UmaDataQualquer datetime\r\nSET @UmaDataQualquer = CURRENT_TIMESTAMP\u00a0\r\n\r\nSELECT \r\n\t@UmaDataQualquer AS [datetime]\r\n\t,CONVERT(varchar(10),@UmaDataQualquer,103)  AS [varchar(10)] -- Podemos converter qualquer formato de data para texto\r\n\t,CONVERT(varchar(6),@UmaDataQualquer,103)  AS [varchar(6)] -- Se voc\u00ea colocar o tamanho incorreto, poder\u00e1 ter ver os dados cortados\r\n\r\n-- O dateformat n\u00e3o tem nenhum efeito sobre a sa\u00edda\r\nSET DATEFORMAT dmy;\r\nSELECT @UmaDataQualquer [datetime],CONVERT(varchar(10),@UmaDataQualquer,103)  AS [Texto,DATEFORMAT = dmy] \r\nSET DATEFORMAT mdy;\r\nSELECT @UmaDataQualquer [datetime],CONVERT(varchar(10),@UmaDataQualquer,103)  AS [Texto,DATEFORMAT = mdy]<\/pre>\n<p>Uma coisa interessante \u00e9 que podemos notar o que foi falado aqui com o uso do comando <a title=\"DBCC OUTPUTBUFFER - Books Online\" href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms189821(v=sql.120).aspx\">DBCC OUTPUTBUFFER<\/a>. Basicamente, este comando nos permite ver os dados que uma determinada sess\u00e3o entregou para a aplica\u00e7\u00e3o.\u00a0Execute esta query:<\/p>\n<pre class=\"lang:tsql decode:true\" title=\"Observando como uma data \u00e9 entregue\">DECLARE\r\n @UmaDataQualquer datetime\r\nSET @UmaDataQualquer = CURRENT_TIMESTAMP\u00a0\r\n\r\nselect 'ANTES_DA_DATA',CONVERT(varchar(10),@UmaDataQualquer,103),'DEPOIS_DA_DATA';\r\nselect 'ANTES_DA_DATA',@UmaDataQualquer,'DEPOIS_DA_DATA';\r\n<\/pre>\n<p>Agora abra outra sess\u00e3o e execute o comando DBCC OUTPUTBUFFER, passando como par\u00e2metro o n\u00famero da sess\u00e3o onde a query anterior foi executada (no meu caso, foi 51):<\/p>\n<pre class=\"lang:tsql decode:true\" title=\"OUTPUT BUFFER\">-- Voc\u00ea dever\u00e1 ser sysadmin para executar este comando.\r\n-- Substitua 51 pelo n\u00famero da sess\u00e3o desejado\r\nDBCC OUTPUTBUFFER(51)<\/pre>\n<p>Voc\u00ea dever\u00e1 um resultado parecido com este (irei manter somente o in\u00edcio, que \u00e9 o relevante pra n\u00f3s neste momento):<\/p>\n<p><span style=\"font-family: 'courier new', courier;\">00000040 04 f0 00 36 00 d1 0d 00 41 4e 54 45 53 5f 44 41 .\u00f0.6.\u00d1..<strong><span style=\"color: #008000;\">ANTES_DA<\/span><\/strong><\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> 00000050 5f 44 41 54 41 0a 00 32 38 2f 30 33 2f 32 30 31 <strong><span style=\"color: #008000;\">_DATA..28\/03\/201<\/span><\/strong><\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> 00000060 35 0e 00 44 45 50 4f 49 53 5f 44 41 5f 44 41 54 <strong><span style=\"color: #008000;\">5..DEPOIS_DA_DAT<\/span><\/strong><\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> 00000070 41 fd 11 00 c1 00 01 00 00 00 00 00 00 00 81 03 A\u00fd..\u00c1&#8230;&#8230;&#8230;..<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> 00000080 00 00 00 00 00 20 00 a7 0d 00 09 04 f0 00 36 00 &#8230;.. .\u00a7.. .\u00f0.6.<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> 00000090 00 00 00 00 21 00 6f 08 00 00 00 00 00 20 00 a7 &#8230;.!.o&#8230;&#8230; .\u00a7<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> 000000a0 0e 00 09 04 f0 00 36 00 d1 0d 00 41 4e 54 45 53 .. .\u00f0.6.\u00d1..<strong><span style=\"color: #0000ff;\">ANTES<\/span><\/strong><\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> 000000b0 5f 44 41 5f 44 41 54 41 08 <span style=\"color: #ffcc00;\"><strong>69 a4 00 00 d9 73 0e<\/strong><\/span> <strong><span style=\"color: #0000ff;\">_DA_DATA.i\u00a4..\u00d9s.<\/span><\/strong><\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> 000000c0 <span style=\"color: #ffcc00;\"><strong>01<\/strong> <\/span>0e 00 44 45 50 4f 49 53 5f 44 41 5f 44 41 54 <span style=\"color: #0000ff;\">&#8230;<strong>DEPOIS_DA_DAT<\/strong><\/span><\/span><\/p>\n<p>Primeiro, repare no trecho em <span style=\"color: #008000;\"><strong>verde.<\/strong>\u00a0<\/span>Este \u00e9 o trecho que corresponde ao primeiro SELECT, onde n\u00f3s usamos um CONVERT para converter a data para\u00a0texto. Perceba que o valor retornado \u00e9 realmente um texto puro, e por isso podemos visualizar facilmente os caracteres correspondentes. Agora, repare o trecho em <span style=\"color: #0000ff;\"><strong>azul.\u00a0<\/strong><\/span>Este trecho corresponde ao segundo SELECT, onde n\u00f3s retornamos a data pura. Notou!? Cad\u00ea a data? Ela est\u00e1 ali, s\u00f3 que est\u00e1 sendo entregue em um formato bin\u00e1rio, cujo seus bytes n\u00e3o s\u00e3o equivalentes aos digitos e barras, conforme no trecho\u00a0anterior. O trecho em bin\u00e1rio que corresponde \u00e0 data est\u00e1 marcado em laranja, apenas por curiosidade (no post que eu prometi sobre data, eu darei mais detalhes \ud83d\ude42 ).<\/p>\n<p>Para finalizar esta parte, um \u00faltimo ponto: Os poderes m\u00e1gicos da data. Uma das grandes vantagens em ter tipos de dados que trabalhem exclusivamente com datas \u00e9 a facilidade que temos em lidar com opera\u00e7\u00f5es aritm\u00e9ticas envolvendo datas, como por exemplo, somar dias, meses, horas, minutos e segundo. Assim, o SQL Server \u00e9 quem se preocupa em fazer todas as verifica\u00e7\u00f5es quando, por exemplo, voc\u00ea adiciona 1 minuto \u00e0 data &#8220;28\/02\/2016 23:59:59.003&#8221;. \u00a0Ordenar datas tamb\u00e9m \u00e9 um diferencial: Por exemplo, considere as datas &#8217;10\/02\/2015&#8242; e &#8217;01\/03\/2015&#8242;. Claramente, se eu te pedisse para ordenar estas datas de forma crescente, voc\u00ea, uma pessoa muito esperta, me diria\u00a0assim:<\/p>\n<p>&#8217;10\/02\/2015&#8242;<br \/>\n&#8217;01\/03\/2015&#8242;<\/p>\n<p>Que est\u00e1 correto! O SQL Server tamb\u00e9m faria exatamente a mesma coisa, se estes valores estiverem sendo trabalhados como data&#8230; Agora olha s\u00f3 o que acontece quando voc\u00ea converte para texto e ordena pelo resultado da convers\u00e3o:<\/p>\n<pre class=\"lang:tsql decode:true\" title=\"Ordena\u00e7\u00e3o de Datas vs Ordena\u00e7\u00e3o de Texto\">DECLARE\r\n @MinhasDatas TABLE(data datetime);\r\n\r\nINSERT INTO @MinhasDatas VALUES('20150210');\r\nINSERT INTO @MinhasDatas VALUES('20150301');\r\n\r\nSELECT data as OrdenadoPorData FROM @MinhasDatas ORDER BY data ASC-- Aqui est\u00e1 ok!\r\n\r\nSELECT data as OrdenadoPorTexto FROM @MinhasDatas ORDER BY CONVERT(varchar(10),data,103) ASC -- Ops!<\/pre>\n<p>Aqui, os resultados:<\/p>\n<p><span style=\"font-size: 12pt;\"><strong><span style=\"font-family: 'courier new', courier;\">OrdenadoPorData<br \/>\n<\/span><\/strong><\/span><span style=\"font-family: 'courier new', courier; font-size: 12pt; line-height: 1.5;\">2015-02-10 00:00:00.000<br \/>\n<\/span><span style=\"font-family: 'courier new', courier; font-size: 12pt; line-height: 1.5;\">2015-03-01 00:00:00.000<\/span><\/p>\n<p><span style=\"font-size: 12pt;\"><strong><span style=\"font-family: 'courier new', courier;\">OrdenadoPorTexto<\/span><\/strong><\/span><br \/>\n<span style=\"font-family: 'courier new', courier; font-size: 12pt;\"> 2015-03-01 00:00:00.000<\/span><br \/>\n<span style=\"font-family: 'courier new', courier; font-size: 12pt;\"> 2015-02-10 00:00:00.000<\/span><\/p>\n<p>Repare que no segundo SELECT,\u00a0a data de mar\u00e7o veio ANTES da data de fevereiro, em um ORDER BY crescente \ud83d\ude2f ! Ser\u00e1 um bug? Nada disso. Quando voc\u00ea converteu para texto e ordenou pelo resultado em texto, as regras de ordena\u00e7\u00e3o mudaram, pois para texto s\u00e3o diferentes das regras para data. \u00a0Veja:<\/p>\n<pre class=\"lang:tsql decode:true \" title=\"Ordem Texto vs Ordem Data - Segredo\">DECLARE\r\n @MinhasDatas TABLE(data datetime);\r\n\r\nINSERT INTO @MinhasDatas VALUES('20150210');\r\nINSERT INTO @MinhasDatas VALUES('20150301');\r\n\r\nSELECT data as OrdenadoPorTexto,CONVERT(varchar(10),data,103) as Convertido FROM @MinhasDatas ORDER BY CONVERT(varchar(10),data,103) ASC\r\n<\/pre>\n<p>Resultados:<\/p>\n<p><strong><span style=\"font-family: 'courier new', courier; font-size: 12pt;\">OrdenadoPorTexto\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Convertido<\/span><\/strong><br \/>\n<span style=\"font-family: 'courier new', courier; font-size: 12pt;\"> 2015-03-01 00:00:00.000 01\/03\/2015<\/span><br \/>\n<span style=\"font-family: 'courier new', courier; font-size: 12pt;\"> 2015-02-10 00:00:00.000 10\/02\/2015<\/span><\/p>\n<p>O motivo \u00e9 simples: \u00a0A string &#8217;01\/03\/2015&#8242; come\u00e7a com &#8216;0&#8217; (d\u00edgito zero), que conforme as regras de ordena\u00e7\u00e3o de texto (onde envolve collations e outras coisas) \u00e9 menor do que &#8216;1&#8217;.<\/p>\n<p>Entendeu o porqu\u00ea deve-se tomar cuidado com as convers\u00f5es de data para texto? No pr\u00f3ximo post, \u00faltimo desta s\u00e9rie, vamos falar sobre os tipos de dados&#8230; Aproveitando o gancho, voc\u00ea saberia explicar o porqu\u00ea disto?<\/p>\n<pre class=\"lang:tsql decode:true \" title=\"Qual o problema?\">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>&nbsp;<\/p>\n<p>Se n\u00e3o, aguarde o pr\u00f3ximo post (Que tentarei publicar na semana que vem).<\/p>\n[]&#8217;s<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">This entry is part 2 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>Ol\u00e1!\u00a0No \u00faltimo post, focamos em como o SQL Server entende as datas que enviamos no c\u00f3digo T-SQL. Para resumir: Especificar datas no SQL Server \u00e9 como especificar uma string qualquer, por\u00e9m com um formato espec\u00edfico.\u00a0Voc\u00ea pode usar o DATEFORMAT para auxiliar na interpreta\u00e7\u00e3o do SQL Server (e n\u00e3o como a data \u00e9 exibida) ou usar&hellip;&nbsp;<a href=\"https:\/\/thesqltimes.com\/blog\/2015\/03\/28\/sql-datas-parte2\/\" rel=\"bookmark\"><span class=\"screen-reader-text\">2. SQL Server, Datas e Horas: Exibi\u00e7\u00e3o e Convers\u00f5es<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":644,"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":[3,11,7],"tags":[139,140,134,125,131,126,136,137,135,138,73,141],"series":[124],"class_list":["post-616","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-banco-de-dados-2","category-desenvolvimento","category-sql-server","tag-cast","tag-convert","tag-datas","tag-date","tag-dateformat","tag-datetime","tag-exibicao","tag-formatar-datas","tag-horas","tag-output","tag-sql-server","tag-style","series-sql-datas-basico"],"_links":{"self":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/616","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=616"}],"version-history":[{"count":18,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/616\/revisions"}],"predecessor-version":[{"id":962,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/616\/revisions\/962"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media\/644"}],"wp:attachment":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media?parent=616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/categories?post=616"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/tags?post=616"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/series?post=616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}