{"id":381,"date":"2019-11-30T18:00:25","date_gmt":"2019-11-30T18:00:25","guid":{"rendered":"https:\/\/datablog.roman-halliday.com\/?p=381"},"modified":"2019-10-26T15:55:54","modified_gmt":"2019-10-26T15:55:54","slug":"dates-in-sql-server-creating-date-range-batches","status":"publish","type":"post","link":"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/","title":{"rendered":"Dates In SQL Server: Creating Date Range Batches"},"content":{"rendered":"\n<p>I thought I&#8217;d covered everything I could cover on dates in SQL Server in my previous series. But a new challenge raised something which wasn&#8217;t already in there.<\/p>\n\n\n\n<p>I found a scenario where I wanted to identify groups of consecutive dates over a larger date range. There was a process which took a start date and an end date and would process all data in that range. I wanted to go over a lot of history, but only reprocess the dates which had been impacted. I could identify the dates which needed reprocessing, many of which were sequential. But there were also numerous days and groups of days which didn&#8217;t need to be re-processed.<\/p>\n\n\n\n<p>The solution was to identify the consecutive date ranges and put them into a cursor, with a start date and end date for each row. Solitary dates would be represented with one record having the same start and end date.<\/p>\n\n\n\n<p>In the below worked solution, I&#8217;ve spread things out a bit to make reading and understanding a little easier. I believe easy to read and debug code is often better than highly compact code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sample Date Data<\/h2>\n\n\n\n<p>While I had a list of dates which needed re-processing, for this example I&#8217;ll use dates created using my <a href=\"https:\/\/datablog.roman-halliday.com\/index.php\/2018\/08\/04\/number-sequences\/\">number sequence method<\/a>. And identify weekdays as the grouping.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">--------------------------------------------------------------------------------\n-- Create Date Table\n--------------------------------------------------------------------------------\nIF OBJECT_ID('tempdb..#date_t') IS NOT NULL\n    DROP TABLE #date_t;\n\nIF OBJECT_ID('tempdb..#ProcessingBatches') IS NOT NULL\n    DROP TABLE #ProcessingBatches;\n\nCREATE TABLE #date_t\n(\n  [TheDate]   DATE NOT NULL PRIMARY KEY,\n  [IsWeekend] INT  NOT NULL,\n  [IsWeekday] INT  NOT NULL,\n);\n\n--------------------------------------------------------------------------------\n-- Create Date list\n-- Using Number sequence: https:\/\/datablog.roman-halliday.com\/index.php\/2018\/06\/01\/dates-in-sql-server-create-sample-date-ranges\/\n--------------------------------------------------------------------------------\n\n-- Set the start of the week to 'Monday'\n-- In this example, I'm batching things by 'working' week days\nSET DATEFIRST 1;\n\nDECLARE @DateStart DATE = '01-JAN-19';\nDECLARE @DateEnd   DATE = EOMONTH('01-MAR-19');\nPRINT 'Start Date: ' + CONVERT(VARCHAR(10), @DateStart, 120);\nPRINT 'Start End: '  + CONVERT(VARCHAR(10), @DateEnd,   120);\n\nWITH number_tbl AS (\nSELECT 0 AS a UNION ALL\nSELECT 1 UNION ALL\nSELECT 2 UNION ALL\nSELECT 3 UNION ALL\nSELECT 4 UNION ALL\nSELECT 5 UNION ALL\nSELECT 6 UNION ALL\nSELECT 7 UNION ALL\nSELECT 8 UNION ALL\nSELECT 9\n), number_sequences AS (\nSELECT t1.a AS t1a,\n       t2.a AS t2a,\n       t3.a AS t3a,\n       (t3.a + (10 * t2.a) + (100 * t1.a)) AS concatenate_calculation\n  FROM number_tbl t1\n  CROSS JOIN number_tbl t2\n  CROSS JOIN number_tbl t3\n), date_sequence AS (\nSELECT CAST(DateAdd(DAY, concatenate_calculation, @DateStart) AS DATE) AS [TheDate]\n  FROM number_sequences\n WHERE CAST(DateAdd(DAY, concatenate_calculation, @DateStart) AS DATE) &lt;= @DateEnd\n)\nINSERT\n  INTO #date_t\n      ([TheDate], [IsWeekend], [IsWeekday])\nSELECT [TheDate],\n       CASE WHEN DatePart(dw, [TheDate]) IN (6, 7) THEN 1 ELSE 0 END AS [IsWeekend],\n       CASE WHEN DatePart(dw, [TheDate]) IN (6, 7) THEN 0 ELSE 1 END AS [IsWeekday]\n  FROM date_sequence\n;\n\nSELECT * FROM #date_t;\n\nGO<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Put Processing Days Into Batches<\/h2>\n\n\n\n<p>Line 16 is where the magic happens. The difference in number of days between the row number and the given date. Consecutive dates will have the same difference. But if there is a jump in date, the difference will also jump.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"16\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">----------------------------------------------------------------------------\n-- Put unprocessed days into batches\n----------------------------------------------------------------------------\nWITH ds AS (\nSELECT rcc.*,\n       ROW_NUMBER() OVER (ORDER BY rcc.[TheDate]) AS [row_num]\n  FROM #date_t rcc\n WHERE 1=1\n   AND [IsWeekday] = 1 -- Whatever our filter criteria is for each batch\n)\nSELECT DateDiff(DAY, [row_num], [TheDate]) AS [DiffDays],\n       MIN([TheDate])                      AS [batch_start_date],\n       MAX([TheDate])                      AS [batch_end_date]\n  INTO #ProcessingBatches\n  FROM ds\n GROUP BY DateDiff(DAY, [row_num], [TheDate]) -- This is our calculation of if dates are consecutive\n;\n\nCREATE UNIQUE\n INDEX PK_ProcessingBatches\n    ON #ProcessingBatches\n      ([DiffDays])\n;\n\nSELECT * FROM #ProcessingBatches;<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Create &amp; Iterate Cursor<\/h2>\n\n\n\n<p>Declare a cursor and iterate over it in a loop, processing the dates in the batches as identified above.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">--------------------------------------------------------------------------------\n-- Craete Cursor\n--------------------------------------------------------------------------------\nDECLARE processing_date_cursor CURSOR FOR\nSELECT [DiffDays], [batch_start_date], [batch_end_date]\n  FROM #ProcessingBatches\n;\n\n--------------------------------------------------------------------------------\n-- Iterate Cursor\n--------------------------------------------------------------------------------\nDECLARE @DiffDays  BIGINT;\nDECLARE @DateStart DATE;\nDECLARE @DateEnd   DATE;\n\nOPEN processing_date_cursor;\nFETCH NEXT FROM processing_date_cursor INTO @DiffDays, @DateStart, @DateEnd;\nIF @@FETCH_STATUS &lt;> 0\n    PRINT 'Empty Cursor'\nWHILE @@FETCH_STATUS = 0\nBEGIN\n    PRINT CONVERT(VARCHAR, GetDate(), 120) + ' - Executing Range: ' + CONVERT(VARCHAR(20), @DateStart, 120) + ' --> ' + CONVERT(VARCHAR(20), @DateEnd, 120) ;\n    ----------------------------------------------------------------------------\n    -- Process Start\n    ----------------------------------------------------------------------------\n    PRINT 'START: ' + CONVERT(VARCHAR(10), @DateStart, 120);\n    PRINT '  END: ' + CONVERT(VARCHAR(10),   @DateEnd, 120);\n\n    ----------------------------------------------------------------------------\n    -- It is always possible to chunk the date ranges up smaller with the\n    -- techiniques shown here:\n    -- 'Dynamic batches of dates'\n    -- https:\/\/datablog.roman-halliday.com\/index.php\/2018\/06\/09\/dates-in-sql-server-iteration-of-date-ranges\/\n    ----------------------------------------------------------------------------\n    \n    \/*\n    EXECUTE [DB].[Schema].[stored_procedure]  \n        @StartDateVariable = @DateStart,\n        @EndDateVariable   = @DateEnd\n    ;\n    *\/\n\n    ----------------------------------------------------------------------------\n    -- Process End\n    ----------------------------------------------------------------------------\n    FETCH NEXT FROM processing_date_cursor INTO @DiffDays, @DateStart, @DateEnd;\nEND\n\n--------------------------------------------------------------------------------\n-- Close Cursor\n--------------------------------------------------------------------------------\nCLOSE processing_date_cursor;\nDEALLOCATE processing_date_cursor;<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>I found a scenario where I wanted to identify groups of consecutive dates over a larger date range.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,4],"tags":[12],"class_list":["post-381","post","type-post","status-publish","format-standard","hentry","category-databases","category-sql-server","tag-date"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Dates In SQL Server: Creating Date Range Batches - Rows Across The Lake<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dates In SQL Server: Creating Date Range Batches - Rows Across The Lake\" \/>\n<meta property=\"og:description\" content=\"I found a scenario where I wanted to identify groups of consecutive dates over a larger date range.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/\" \/>\n<meta property=\"og:site_name\" content=\"Rows Across The Lake\" \/>\n<meta property=\"article:published_time\" content=\"2019-11-30T18:00:25+00:00\" \/>\n<meta name=\"author\" content=\"david\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@d_roman_h\" \/>\n<meta name=\"twitter:site\" content=\"@d_roman_h\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"david\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2019\\\/11\\\/30\\\/dates-in-sql-server-creating-date-range-batches\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2019\\\/11\\\/30\\\/dates-in-sql-server-creating-date-range-batches\\\/\"},\"author\":{\"name\":\"david\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#\\\/schema\\\/person\\\/575f96d2590c3085923ff9e1b565748b\"},\"headline\":\"Dates In SQL Server: Creating Date Range Batches\",\"datePublished\":\"2019-11-30T18:00:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2019\\\/11\\\/30\\\/dates-in-sql-server-creating-date-range-batches\\\/\"},\"wordCount\":300,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#\\\/schema\\\/person\\\/575f96d2590c3085923ff9e1b565748b\"},\"keywords\":[\"date\"],\"articleSection\":[\"Databases\",\"SQL Server\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2019\\\/11\\\/30\\\/dates-in-sql-server-creating-date-range-batches\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2019\\\/11\\\/30\\\/dates-in-sql-server-creating-date-range-batches\\\/\",\"url\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2019\\\/11\\\/30\\\/dates-in-sql-server-creating-date-range-batches\\\/\",\"name\":\"Dates In SQL Server: Creating Date Range Batches - Rows Across The Lake\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#website\"},\"datePublished\":\"2019-11-30T18:00:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2019\\\/11\\\/30\\\/dates-in-sql-server-creating-date-range-batches\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2019\\\/11\\\/30\\\/dates-in-sql-server-creating-date-range-batches\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2019\\\/11\\\/30\\\/dates-in-sql-server-creating-date-range-batches\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dates In SQL Server: Creating Date Range Batches\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#website\",\"url\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/\",\"name\":\"Rows Across The Lake\",\"description\":\"Data &amp; Databases\",\"publisher\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#\\\/schema\\\/person\\\/575f96d2590c3085923ff9e1b565748b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#\\\/schema\\\/person\\\/575f96d2590c3085923ff9e1b565748b\",\"name\":\"david\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g\",\"caption\":\"david\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Dates In SQL Server: Creating Date Range Batches - Rows Across The Lake","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/","og_locale":"en_GB","og_type":"article","og_title":"Dates In SQL Server: Creating Date Range Batches - Rows Across The Lake","og_description":"I found a scenario where I wanted to identify groups of consecutive dates over a larger date range.","og_url":"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/","og_site_name":"Rows Across The Lake","article_published_time":"2019-11-30T18:00:25+00:00","author":"david","twitter_card":"summary_large_image","twitter_creator":"@d_roman_h","twitter_site":"@d_roman_h","twitter_misc":{"Written by":"david","Estimated reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/#article","isPartOf":{"@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/"},"author":{"name":"david","@id":"https:\/\/datablog.roman-halliday.com\/#\/schema\/person\/575f96d2590c3085923ff9e1b565748b"},"headline":"Dates In SQL Server: Creating Date Range Batches","datePublished":"2019-11-30T18:00:25+00:00","mainEntityOfPage":{"@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/"},"wordCount":300,"commentCount":0,"publisher":{"@id":"https:\/\/datablog.roman-halliday.com\/#\/schema\/person\/575f96d2590c3085923ff9e1b565748b"},"keywords":["date"],"articleSection":["Databases","SQL Server"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/","url":"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/","name":"Dates In SQL Server: Creating Date Range Batches - Rows Across The Lake","isPartOf":{"@id":"https:\/\/datablog.roman-halliday.com\/#website"},"datePublished":"2019-11-30T18:00:25+00:00","breadcrumb":{"@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2019\/11\/30\/dates-in-sql-server-creating-date-range-batches\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/datablog.roman-halliday.com\/"},{"@type":"ListItem","position":2,"name":"Dates In SQL Server: Creating Date Range Batches"}]},{"@type":"WebSite","@id":"https:\/\/datablog.roman-halliday.com\/#website","url":"https:\/\/datablog.roman-halliday.com\/","name":"Rows Across The Lake","description":"Data &amp; Databases","publisher":{"@id":"https:\/\/datablog.roman-halliday.com\/#\/schema\/person\/575f96d2590c3085923ff9e1b565748b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/datablog.roman-halliday.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/datablog.roman-halliday.com\/#\/schema\/person\/575f96d2590c3085923ff9e1b565748b","name":"david","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g","caption":"david"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g"}}]}},"_links":{"self":[{"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/posts\/381","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/comments?post=381"}],"version-history":[{"count":5,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/posts\/381\/revisions"}],"predecessor-version":[{"id":386,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/posts\/381\/revisions\/386"}],"wp:attachment":[{"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/media?parent=381"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/categories?post=381"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/tags?post=381"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}