There are more AWS SDK examples available in the AWS Doc SDK Examples
The following code examples show how to query tables using date and time patterns.
Store and query date/time values in DynamoDB.
Implement date range queries using sort keys.
Format date strings for effective querying.
- SDK for Java 2.x
-
Query using date ranges in sort keys with AWS SDK for Java 2.x.
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.DynamoDbException; import software.amazon.awssdk.services.dynamodb.model.QueryRequest; import software.amazon.awssdk.services.dynamodb.model.QueryResponse; import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException; import java.time.LocalDate; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; public QueryResponse queryWithDateRange( final String tableName, final String partitionKeyName, final String partitionKeyValue, final String dateKeyName, final LocalDate startDate, final LocalDate endDate) { // Focus on query logic, assuming parameters are valid if (startDate == null || endDate == null) { throw new IllegalArgumentException("Start date and end date cannot be null"); } if (endDate.isBefore(startDate)) { throw new IllegalArgumentException("End date must be after start date"); } // Format dates as ISO strings for DynamoDB (using just the date part) final String formattedStartDate = startDate.toString(); final String formattedEndDate = endDate.toString(); // Create expression attribute names for the column names final Map<String, String> expressionAttributeNames = new HashMap<>(); expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_PK, partitionKeyName); expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_SK, dateKeyName); // Create expression attribute values for the column values final Map<String, AttributeValue> expressionAttributeValues = new HashMap<>(); expressionAttributeValues.put( EXPRESSION_ATTRIBUTE_VALUE_PK, AttributeValue.builder().s(partitionKeyValue).build()); expressionAttributeValues.put( EXPRESSION_ATTRIBUTE_VALUE_START_DATE, AttributeValue.builder().s(formattedStartDate).build()); expressionAttributeValues.put( EXPRESSION_ATTRIBUTE_VALUE_END_DATE, AttributeValue.builder().s(formattedEndDate).build()); // Create the query request final QueryRequest queryRequest = QueryRequest.builder() .tableName(tableName) .keyConditionExpression(KEY_CONDITION_EXPRESSION) .expressionAttributeNames(expressionAttributeNames) .expressionAttributeValues(expressionAttributeValues) .build(); try { final QueryResponse response = dynamoDbClient.query(queryRequest); LOGGER.log(Level.INFO, "Query by date range successful. Found {0} items", response.count()); return response; } catch (ResourceNotFoundException e) { LOGGER.log(Level.SEVERE, "Table not found: {0}", tableName); throw e; } catch (DynamoDbException e) { LOGGER.log(Level.SEVERE, "Error querying by date range: {0}", e.getMessage()); throw e; } }
Query using date-time variables with AWS SDK for Java 2.x.
import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.DynamoDbException; import software.amazon.awssdk.services.dynamodb.model.QueryRequest; import software.amazon.awssdk.services.dynamodb.model.QueryResponse; import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.HashMap; import java.util.Map; public QueryResponse queryWithDateTime( final String tableName, final String partitionKeyName, final String partitionKeyValue, final String dateKeyName, final String startDate, final String endDate) { CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue); CodeSampleUtils.validateDateRangeParameters(dateKeyName, startDate, endDate); CodeSampleUtils.validateDateFormat("Start date", startDate); CodeSampleUtils.validateDateFormat("End date", endDate); // Create expression attribute names for the column names final Map<String, String> expressionAttributeNames = new HashMap<>(); expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_PK, partitionKeyName); expressionAttributeNames.put("#dateKey", dateKeyName); // Create expression attribute values for the column values final Map<String, AttributeValue> expressionAttributeValues = new HashMap<>(); expressionAttributeValues.put( EXPRESSION_ATTRIBUTE_VALUE_PK, AttributeValue.builder().s(partitionKeyValue).build()); expressionAttributeValues.put( ":startDate", AttributeValue.builder().s(startDate).build()); expressionAttributeValues.put( ":endDate", AttributeValue.builder().s(endDate).build()); // Create the query request final QueryRequest queryRequest = QueryRequest.builder() .tableName(tableName) .keyConditionExpression(KEY_CONDITION_EXPRESSION) .expressionAttributeNames(expressionAttributeNames) .expressionAttributeValues(expressionAttributeValues) .build(); try { final QueryResponse response = dynamoDbClient.query(queryRequest); System.out.println("Query successful. Found " + response.count() + " items"); return response; } catch (ResourceNotFoundException e) { System.err.format("Error: The Amazon DynamoDB table \"%s\" can't be found.\n", tableName); throw e; } catch (DynamoDbException e) { System.err.println("Error querying with date range: " + e.getMessage()); throw e; } }
Query within date ranges in Unix epoch timestamps with AWS SDK for Java 2.x.
import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.DynamoDbException; import software.amazon.awssdk.services.dynamodb.model.QueryRequest; import software.amazon.awssdk.services.dynamodb.model.QueryResponse; import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.HashMap; import java.util.Map; public QueryResponse queryWithDateTimeEpoch( final String tableName, final String partitionKeyName, final String partitionKeyValue, final String dateKeyName, final long startEpoch, final long endEpoch) { CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue); CodeSampleUtils.validateStringParameter("Date key name", dateKeyName); CodeSampleUtils.validateEpochTimestamp("Start epoch", startEpoch); CodeSampleUtils.validateEpochTimestamp("End epoch", endEpoch); // Create expression attribute names for the column names final Map<String, String> expressionAttributeNames = new HashMap<>(); expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_PK, partitionKeyName); expressionAttributeNames.put("#dateKey", dateKeyName); // Create expression attribute values for the column values final Map<String, AttributeValue> expressionAttributeValues = new HashMap<>(); expressionAttributeValues.put( EXPRESSION_ATTRIBUTE_VALUE_PK, AttributeValue.builder().s(partitionKeyValue).build()); expressionAttributeValues.put( ":startDate", AttributeValue.builder().n(String.valueOf(startEpoch)).build()); expressionAttributeValues.put( ":endDate", AttributeValue.builder().n(String.valueOf(endEpoch)).build()); // Create the query request final QueryRequest queryRequest = QueryRequest.builder() .tableName(tableName) .keyConditionExpression(KEY_CONDITION_EXPRESSION) .expressionAttributeNames(expressionAttributeNames) .expressionAttributeValues(expressionAttributeValues) .build(); try { final QueryResponse response = dynamoDbClient.query(queryRequest); System.out.println("Query successful. Found " + response.count() + " items"); return response; } catch (ResourceNotFoundException e) { System.err.format("Error: The Amazon DynamoDB table \"%s\" can't be found.\n", tableName); throw e; } catch (DynamoDbException e) { System.err.println("Error querying with epoch timestamps: " + e.getMessage()); throw e; } }
Query within date ranges using LocalDateTime objects with AWS SDK for Java 2.x.
import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.DynamoDbException; import software.amazon.awssdk.services.dynamodb.model.QueryRequest; import software.amazon.awssdk.services.dynamodb.model.QueryResponse; import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.HashMap; import java.util.Map; public QueryResponse queryWithDateTimeLocalDateTime( final String tableName, final String partitionKeyName, final String partitionKeyValue, final String dateKeyName, final LocalDateTime startDateTime, final LocalDateTime endDateTime) { CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue); CodeSampleUtils.validateStringParameter("Date key name", dateKeyName); if (startDateTime == null || endDateTime == null) { throw new IllegalArgumentException("Start and end LocalDateTime must not be null"); } // Convert LocalDateTime to ISO-8601 strings in UTC with the correct format final String startDate = startDateTime.atZone(ZoneOffset.UTC).format(DATE_TIME_FORMATTER); final String endDate = endDateTime.atZone(ZoneOffset.UTC).format(DATE_TIME_FORMATTER); return queryWithDateTime(tableName, partitionKeyName, partitionKeyValue, dateKeyName, startDate, endDate); }
-
For API details, see Query in AWS SDK for Java 2.x API Reference.
-