smoore4
smoore4

Reputation: 4866

Alexa built-in slot AMAZON.DATE

When using the built-in slot AMAZON.DATE, "next week" is interpreted as 2016-W38 per the developer reference.

Utterances that map to just a specific week (such as “this week” or “next week”), convert a date indicating the week number: 2015-W49.

I am trying to parse this in SQL. Is the first week of the year W1 or W01 when using the Alexa services? Thanks.

Upvotes: 3

Views: 1654

Answers (2)

smoore4
smoore4

Reputation: 4866

This is how I ended up parsing the AMAZON.DATE built-in slot using a SQL Server stored procedure.

CREATE PROCEDURE [dbo].[procMomaAlexaExhibitions]

@p_alexa_date VARCHAR(50) = ''

AS
BEGIN

SET NOCOUNT ON;

DECLARE @p_start_date VARCHAR(10) = ''
DECLARE @p_end_date VARCHAR(10) = ''

--SET @p_alexa_date = '2015-W20-WE'

-- Today if null
IF(@p_alexa_date = '' OR @p_alexa_date IS NULL)
BEGIN
SET @p_start_date = (SELECT CONVERT(VARCHAR(10), GETDATE(), 121)) 
SET @p_end_date = (SELECT CONVERT(VARCHAR(10), GETDATE(), 121)) 
END

-- Alexa provided a normal date
IF(ISDATE(@p_alexa_date) = 1)
BEGIN
SET @p_start_date =  CONVERT(VARCHAR(10), @p_alexa_date, 121) 
SET @p_end_date =  CONVERT(VARCHAR(10), @p_alexa_date, 121) 
END

-- Alexa provided a year-month
IF(LEN(@p_alexa_date) <= 8 AND ISNUMERIC(REPLACE(@p_alexa_date,'-','')) = 1)
BEGIN
SET @p_start_date = @p_alexa_date + '-01' 
SET @p_end_date =  @p_alexa_date + '-31' 
END

-- weekend
IF(RIGHT(@p_alexa_date, 3) = '-WE') 
    BEGIN
    DECLARE @p_week VARCHAR(2)
    DECLARE @p_year VARCHAR(4)
    DECLARE @p_start_date_wk VARCHAR(10) = ''
    DECLARE @p_end_date_wk VARCHAR(10) = ''

    SET @p_week = REPLACE(SUBSTRING(@p_alexa_date,7, LEN(@p_alexa_date)),'-WE','')
    SET @p_year = LEFT(@p_alexa_date, 4)

    SET @p_start_date_wk = CONVERT(VARCHAR(10),  DATEADD(wk, DATEDIFF(wk, 6, '1/1/' + @p_year) + (@p_week-1), 6), 121)  
    SET @p_end_date_wk = CONVERT(VARCHAR(10), DATEADD(wk, DATEDIFF(wk, 5, '1/1/' + @p_year) + (@p_week-1), 5), 121)    

    SET @p_start_date = CASE WHEN datename(weekday, CAST(@p_start_date_wk AS smalldatetime)) = 'Saturday' THEN CONVERT(VARCHAR(10), CAST(@p_start_date_wk AS smalldatetime), 121)  
                             WHEN datename(weekday, CAST(@p_start_date_wk AS smalldatetime) + 1) = 'Saturday' THEN CONVERT(VARCHAR(10), CAST(@p_start_date_wk AS smalldatetime) + 1, 121)  
                             WHEN datename(weekday, CAST(@p_start_date_wk AS smalldatetime) + 2) = 'Saturday' THEN CONVERT(VARCHAR(10), CAST(@p_start_date_wk AS smalldatetime) + 2, 121)  
                             WHEN datename(weekday, CAST(@p_start_date_wk AS smalldatetime) + 3) = 'Saturday' THEN CONVERT(VARCHAR(10), CAST(@p_start_date_wk AS smalldatetime) + 3, 121)  
                             WHEN datename(weekday, CAST(@p_start_date_wk AS smalldatetime) + 4) = 'Saturday' THEN CONVERT(VARCHAR(10), CAST(@p_start_date_wk AS smalldatetime) + 4, 121)  
                             WHEN datename(weekday, CAST(@p_start_date_wk AS smalldatetime) + 5) = 'Saturday' THEN CONVERT(VARCHAR(10), CAST(@p_start_date_wk AS smalldatetime) + 5, 121)  
                             WHEN datename(weekday, CAST(@p_start_date_wk AS smalldatetime) + 6) = 'Saturday' THEN CONVERT(VARCHAR(10), CAST(@p_start_date_wk AS smalldatetime) + 6, 121)  
                             END
    SET @p_end_date = CASE WHEN datename(weekday, CAST(@p_end_date_wk AS smalldatetime)) = 'Sunday' THEN CONVERT(VARCHAR(10), CAST(@p_end_date_wk AS smalldatetime), 121)  
                             WHEN datename(weekday, CAST(@p_end_date_wk AS smalldatetime) + 1) = 'Sunday' THEN CONVERT(VARCHAR(10), CAST(@p_end_date_wk AS smalldatetime) + 1, 121)  
                             WHEN datename(weekday, CAST(@p_end_date_wk AS smalldatetime) + 2) = 'Sunday' THEN CONVERT(VARCHAR(10), CAST(@p_end_date_wk AS smalldatetime) + 2, 121)  
                             WHEN datename(weekday, CAST(@p_end_date_wk AS smalldatetime) + 3) = 'Sunday' THEN CONVERT(VARCHAR(10), CAST(@p_end_date_wk AS smalldatetime) + 3, 121)  
                             WHEN datename(weekday, CAST(@p_end_date_wk AS smalldatetime) + 4) = 'Sunday' THEN CONVERT(VARCHAR(10), CAST(@p_end_date_wk AS smalldatetime) + 4, 121)  
                             WHEN datename(weekday, CAST(@p_end_date_wk AS smalldatetime) + 5) = 'Sunday' THEN CONVERT(VARCHAR(10), CAST(@p_end_date_wk AS smalldatetime) + 5, 121)  
                             WHEN datename(weekday, CAST(@p_end_date_wk AS smalldatetime) + 6) = 'Sunday' THEN CONVERT(VARCHAR(10), CAST(@p_end_date_wk AS smalldatetime) + 6, 121)  
                             END
    END

-- not a weekend
IF((@p_alexa_date LIKE '%-W%') AND (RIGHT(@p_alexa_date, 3) <> '-WE'))
    BEGIN

    SET @p_week = SUBSTRING(@p_alexa_date,7, LEN(@p_alexa_date))
    SET @p_year = LEFT(@p_alexa_date, 4)

    SET @p_start_date = CONVERT(VARCHAR(10),  DATEADD(wk, DATEDIFF(wk, 6, '1/1/' + @p_year) + (@p_week-1), 6), 121)  
    SET @p_end_date = CONVERT(VARCHAR(10), DATEADD(wk, DATEDIFF(wk, 5, '1/1/' + @p_year) + (@p_week-1), 5), 121)    

    END

From there you can do things like this in SQL. FYI

WHERE  (ExhVenuesXrefs.BeginISODate <= @p_start_date) 
AND (ExhVenuesXrefs.EndISODate >= @p_end_date) 

Upvotes: 0

pythonjsgeo
pythonjsgeo

Reputation: 5411

UPDATED: Dates are in ISO-8601 date format. First week is W01, there is no W00.

Reference: https://en.wikipedia.org/wiki/ISO_8601#Dates

Source: https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/alexa-skills-kit-interaction-model-reference

Original answer:

I can't find docs, but here is the answer...

  • Today is Wed 28th sept, day 272.
  • Alexa says this is 2016-W39. (I just checked).
  • 2016 started on a Friday, so W39 started last Friday on day 267 which is 38 weeks after Jan 1st. (267/7=38.14).
  • Count back 38 weeks to start of year.

Therefore, first week of the year is called W1.

Upvotes: 2

Related Questions