I was trying to add a date picker to allow the filtering of a Calendar list in SharePoint. Unfortunately I had SharePoint Foundation, which is missing the Date Filter web part which only comes with the Enterprise edition of SharePoint.
I found this article, which works great for filtering a specific date. My calendar items have a StartTime and EndTime though, and could take place over several days. Since the filter connection only allows the filtering based on a single field, this wasn’t going to work.
I ended up making the changes in SharePoint Designer, which allows for parameters and multiple filters based on those parameters. Unfortunately it wasn’t as easy as adding a DateTimeControl to the view, as the DateTimeControl outputs dates in a format that’s incompatible with the list filters. I ended up writing some Javascript to do the date conversion as well as populate the DateTimeControl with a default date of today. Here’s how to do it:
- Open SharePoint Designer
- Select Lists and Libraries
- Select the calendar you would like to add the filtered list to.

- Add a new view to your list.

- Click the view to edit it.
- Put your cursor just above the list and select:
Insert -> SharePoint -> DateTimeControl
- Modify the properties of the DateTimeControl. Set:
AutoPostBack = True
DateOnly = True - Now we have to add in some javascript to convert the output of the DateTimeControl to a format that the SharePoint filters will recognize (YYYY-MM-DD). Go to the Code view and between the </div> and </content> of the DateTimeControl add the following:
<input type="hidden" name="spFilterDate" id="spFilterDate"/>
<script type="text/javascript">
function formatDateSharePoint(date)
{
var d = date.getDate();
var m = date.getMonth()+1;
var y = date.getFullYear();
return '' + y +'-'+ (m<=9?'0'+m:m) +'-'+ (d<=9?'0'+d:d);
}
function formatDateSharePointView(date)
{
var d = date.getDate();
var m = date.getMonth()+1;
var y = date.getFullYear();
return '' + (m<=9?'0'+m:m) +'/'+ (d<=9?'0'+d:d) + '/' + y;
}
function datePickerChange()
{
var datePicker = document.getElementById(g_strDateTimeControlIDs["DateTimeControl1"]);
var date = new Date(datePicker.value);
var dateField = document.getElementById("spFilterDate");
dateField.value = formatDateSharePoint(date);
}
function datePickerDefault()
{
var datePicker = document.getElementById(g_strDateTimeControlIDs["DateTimeControl1"]);
var date = new Date(datePicker.value);
if (isNaN( date.getTime() ))
{
date = new Date();
datePicker.value = formatDateSharePointView(date);
__doPostBack(g_strDateTimeControlIDs["DateTimeControl1"],"");
}
}
//Call the datePickerChange on Postback, as the client side DatePickerControl events only work on IE.
//The only reliable way to call the function on postback seems to be to override the __doPostBack function
var __originalPostBack= __doPostBack;
function beforePostBack(eventTarget, eventArgument) {
datePickerChange();
__originalPostBack(eventTarget, eventArgument);
}
__doPostBack = beforePostBack;
//Default the date picker to Today, if it's not already set
datePickerDefault();
</script>
So now the code for the DateTime Control should look like:
<content>
<div>
<SharePoint:DateTimeControl runat="server" id="DateTimeControl1" AutoPostBack="True" DateOnly="True" />
</div>
<input type="hidden" name="spFilterDate" id="spFilterDate"/>
<script type="text/javascript">
function formatDateSharePoint(date)
{
var d = date.getDate();
var m = date.getMonth()+1;
var y = date.getFullYear();
return '' + y +'-'+ (m<=9?'0'+m:m) +'-'+ (d<=9?'0'+d:d);
}
...
__doPostBack = beforePostBack;
//Default the date picker to Today, if it's not already set
datePickerDefault();
</script>
</content>
So what we’ve done is made it so that every time the DateTimeControl is changed, a hidden field is updated with the date in a format that’s valid for the list filter. Now we need to read that value into a parameter and filter the list based on that parameter:
- Go back to design view, select and list and choose Options -> Parameters.
- Create a new parameter – we’ll call it DateFilter. Set the Source to ‘Form‘ and the Form Field to ‘spFilterDate‘ which is the name of our hidden field.

- Now click on Options -> Filter and create two filters:
StartTime Less Than or Equal To DateFilter And
EndTime Greater Than or Equal To DateFilter

- Save the view.
You can now use this view in SharePoint to filter the calendar to items that occur on a specific date.

Leave a Reply