SPSS Library
Inputting and manipulating dates in SPSS

NOTE:  This page was created using SPSS version 17.0.2.  Some of the syntax shown below may not work in earlier versions of SPSS.

Most of the information regarding date and time formats can be found in the "Universals" section of the SPSS Command Syntax Reference under the heading "Date and Time Functions" and "Date and Time Formats" (page 62 for SPSS version 17).

Inputting dates

There are many ways to input dates in SPSS, and a few of them are shown below.  When specifying date data, you need to have a format for each of the variables.  Date formats include date, adate, edate, jdate and sdate; n is one of the numeric formats.  The date format is an international date; the "a" in adate means "American"; the "e" in edate means "European"; the "j" mean Julian; the "s" means sortable.  Note that when entering European dates, the day is the first number given, followed by the month and the year.  (See the fifth line for an example.)  The sdate date format is used in many Asian countries and is sortable in its character form.  The numbers with the n specify the length of the numeric variable.  The default is 1.  To be extra clear, the formats listed on the data list command tell SPSS what to expect when reading in the data.  If you want to display the date variables in a particular format, you can use the formats command after the data have been read in.

data list list / id (n) day (n2) month (n2) year (n4) c_date (adate) dob (edate).
begin data.
1 23 11 1997 2/2/2006 6.9.1956 
2 17 9   1985 3/2/2005 5.7.1966 
3  30 12 2008 7/14/2005 11.11.1911
4  5 5 2004 12/6/2006 2.8.1922
5 9 9 1999 8/27/2007 14.3.1974 
end data. 

list.
id day month year     c_date        dob 
 
 1  23   11  1997 02/02/2006 06.09.1956 
 2  17    9  1985 03/02/2005 05.07.1966 
 3  30   12  2008 07/14/2005 11.11.1911 
 4   5    5  2004 12/06/2006 02.08.1922 
 5   9    9  1999 08/27/2007 14.03.1974 
 
Number of cases read:  5    Number of cases listed:  5

The example below is very similar to the one above, except that we have defined the variable dob as an adate.  The number 2 before the adate indicates that the 2 date variables listed before are adates.

data list list / id (n) expt_date dob (2adate) day (n2) month (n2) year (n4) year1 (adate).
begin data.
1 2/2/2006 6/9/1956 23 11 1997 1/1/1907
2 3/2/2005 5/7/1966 17 9   1985 9/5/1908
3 7/14/2005 11/11/1911 30 12 2008 9/3/1912
4 12/6/2006 2/8/1922 5 5 2004 2/7/1916
5 8/27/2007 3/14/1974 9 9 1999 11/18/1980
end data. 

list.
id  expt_date        dob day month year      year1 
 
 1 02/02/2006 06/09/1956  23   11  1997 01/01/1907 
 2 03/02/2005 05/07/1966  17    9  1985 09/05/1908 
 3 07/14/2005 11/11/1911  30   12  2008 09/03/1912 
 4 12/06/2006 02/08/1922   5    5  2004 02/07/1916 
 5 08/27/2007 03/14/1974   9    9  1999 11/18/1980 
 
Number of cases read:  5    Number of cases listed:  5

In the next example, we will show some different date formats as well as various ways of specifying the dates themselves.  The values of the months can be entered as numbers, three letter abbreviations, Roman numerals or fully spelled out.  Years can be specified as either two or four digits.  To change the century cut off, use the set epoch command.  By default, the current century century range begins 69 years prior to the current year and ends 30 years after the current year.

In the input below, three different types of formats are used.  The variables first_date and second_date are formatted as date.  This means that the values of the day, month and year are separated by a slash, period, dash, comma or space.  The variable third_date is formatted as an adate.  Notice that the month can even been entered as Roman numerals (as shown on the first line).  The variable fourth_date is formatted as a jdate (a Julian date).  When specifying a date as a jdate, the year is given first (either as a two or four digit number) followed by the number of the day of the year.  In our example, we use December 22, which is 356th day of the year; June 30 is the 181st day of the year.  (Please see the yrmoda function below to determine the number of the day of the year.)

NOTE:  When entering fixed format data into the syntax file, it is very important that each data value starts and ends within the specified field.  To be sure in which column a value is starting and ending, put the curser at the beginning (or ending) of a value, and then look in the lower right-hand corner of the syntax window.  Values that are in the same column may appear to be unaligned in the syntax window.

data list fixed 
/ first_date 1-13 (date) second_date 20-36 (date) third_date 37-50 (adate) fourth_date 52-60 (jdate).
begin data.
30/6/03             22 December 1990 XII 22 1990    1990356
30-6-03             22/12/90         12/22/90       90181
30 June, 2003       22.12.1990       Dec. 22, 1990  03181
30.Jun.03           22-DEC-1990      June 30, 03    2003181
end data.

list.
   first_date       second_date     third_date fourth_date
 
30-JUN-2003   22-DEC-1990       12/22/1990      1990356 
30-JUN-2003   22-DEC-1990       12/22/1990      1990181 
30-JUN-2003   22-DEC-1990       12/22/1990      2003181 
30-JUN-2003   22-DEC-1990       06/30/2003      2003181 
 
Number of cases read:  4    Number of cases listed:  4

For information about working with dates entered as strings, please visit How can I convert string variables into date variables?

Formatting dates for display

There are many date formats that you can use to display dates in your data file.  To use them, you issue the formats command, followed by the variable or variables that you want to format, and then specify the format in parentheses after the variable to be formatted.  The number given after the format indicates the length.  Let's use the data set that we just read into SPSS and assign different formats to the variables.  As with input formats, the "a" in adate indicates American, the "e" in edate indicates European, etc.

formats first_date (adate8) second_date (adate10) third_date (edate10) fourth_date (date10).
list.
first_date second_date third_date fourth_date 
 
 06/30/03   12/22/1990 22.12.1990  22-DEC-90 
 06/30/03   12/22/1990 22.12.1990  30-JUN-90 
 06/30/03   12/22/1990 22.12.1990  30-JUN-03 
 06/30/03   12/22/1990 30.06.2003  30-JUN-03 
 
Number of cases read:  4    Number of cases listed:  4

Because dates are simply numeric variables, we can also assign a numeric format to a date variable.  You may want to do this if you need to see the actual numeric value of the date variable.  For example, let's suppose that you want to create a a filter variable such that only dates after a given date are included in the analysis.  To create the filter variable, you need to know the numeric value of the date you want to use as the cutoff.  In the example below, we will use June 30, 2003 as our cutoff date for creating the filter variable.  To make it easy to see the correspondence between the date and its numeric value, we will create a copy of the date variable and format it with a numeric format. 

compute td = third_date.
formats td (f12.0).
list third_date td.
    third_date           td 
 
12/22/1990      12881203200 
12/22/1990      12881203200 
12/22/1990      12881203200 
06/30/2003      13276310400 
 
Number of cases read:  4    Number of cases listed:  4

In the output above, we can see that 12881203200 corresponds to December 22, 1990 and 13276310400 corresponds to June 30, 2003. 

For more information on formats, please see Introduction to SPSS Syntax, Part 2 (section 2).

Manipulating dates

We will use the following data set for our examples.

data list list / id (n) expt_date dob (2adate) day (n2) month (n2) year (n4) year1 (adate).
begin data.
1 2/2/2006 6/9/1956 23 11 1997 1/1/1907
2 3/2/2005 5/7/1966 17 9   1985 9/5/1908
3 7/14/2005 11/11/1911 30 12 2008 9/3/1912
4 12/6/2006 2/8/1922 5 5 2004 2/7/1916
5 8/27/2007 3/14/1974 9 9 1999 11/18/1980
end data. 

Now that we have input data, let's start working with the date variables.  Dates are simply numeric variables in SPSS.  Because "Time 0" was a long time ago, the numeric values of current dates in SPSS are really large.  Dates are stored as the number of seconds from midnight, October 14, 1582 (the beginning of the Gregorian calendar).  Therefore, you usually need to do some math in order to calculate the number of days (or months or years) between two dates.  (Sometimes it is handy to know that there are 86,400 seconds in a day.)  Because dates are stored as numbers, you can do standard mathematical operations on them, such as adding or subtracting them.  If your date is displayed as stars or if only part of the year is showing in the SPSS Data Editor, you can make the column wider and the dates will display properly.

First, we will create a new variable called diff, which will be the difference between expt_date and dob.  As you can see in the output, diff is a numeric variable (as are expt_date and dob).  With the second compute command we will create a new variable called age that will be the subjects' current age.  We will also include a formats command to format the variable diff so that it is not displayed in scientific notation.

compute diff = expt_date - dob.
compute age = diff/(60*60*24*365.25).
formats diff (f16.0).
list expt_date dob diff age.
 expt_date        dob             diff      age 
 
02/02/2006 06/09/1956       1566864000    49.65 
03/02/2005 05/07/1966       1225065600    38.82 
07/14/2005 11/11/1911       2956089600    93.67 
12/06/2006 02/08/1922       2676844800    84.82 
08/27/2007 03/14/1974       1055721600    33.45 
 
Number of cases read:  5    Number of cases listed:  5

Functions

There are many functions that can be used to aid in the manipulation of dates.  These functions are grouped into six categories:  aggregate, conversion, yrmoda (year month day), extraction, date difference and date increments.  Aggregation functions generate date and time intervals from values that were not read by date and time input formats, and they begin with date or time.  The conversion functions convert time intervals from one unit of time to another, and they begin with ctime.  There is only one yrmoda function, and it converts year, month, and day to a day number.  The number returned is the number of days since October 14, 1582 (day 0 of the Gregorian calendar).  This is useful if you need to work with Julian dates.  The extraction functions are used to extract a day or time from a date variable.  These functions start with xdate, followed by a period and the name of the subfuction.  The date difference (datediff) function calculates the difference between two date values and returns an integer in the specified date/time units.  The datesum function calculates a date or time value a specified number of units from a given date or time value.

The aggregate functions

We will start by looking at some of the aggregate functions.  These functions combine two or more variables into a single variable.  In the example below, the date.dmy function is used to combine the variables day, month and year into a single variable called date1.  The formats command is used to format the variables day, month and year (so that they look nicer in the output), and the variable date1 so that it is not displayed in scientific notation. 

compute date1 = date.dmy(day,month,year).
formats day month year (f4.0) date1 (f16.0).
list day month year date1.
 day month year            date1 
 
  23    11 1997      13099622400 
  17     9 1985      12715142400 
  30    12 2008      13449974400 
   5     5 2004      13303094400 
   9     9 1999      13156214400 
 
Number of cases read:  5    Number of cases listed:  5

We can also use the formats to display date1 as a date.

formats date1 (adate10).
list day month year date1.
 day month year      date1 
 
  23    11 1997 11/23/1997 
  17     9 1985 09/17/1985 
  30    12 2008 12/30/2008 
   5     5 2004 05/05/2004 
   9     9 1999 09/09/1999 
 
Number of cases read:  5    Number of cases listed:  5

The yrmoda function

The yrmoda (year-month-day) function converts the year, month and day specified into the number of days (not seconds) since October 14, 1582.  For example, there have been 155,790 days since October 14, 1582.

compute today = yrmoda(2009, 04, 28).
list today.
   today 
 
155790.0 
155790.0 
155790.0 
155790.0 
155790.0 
 
Number of cases read:  5    Number of cases listed:  5

The conversion functions

The conversion functions convert date (and datetime) variables into the unit given in the subfunction (which is the part after the period in the function call).  In the example below, we create a filter variable (called filter1 in our example) such that only subjects with a birthday equal to or later than June 30, 1950 will be included in the analysis.  As we saw above, the yrmoda function returns the number of days (a numeric value) from the date given in the function.  We can use the ctime.days function to compare the values in the variable dob to the date in which we are interested (June 30, 1950).

compute filter1 = 0.
if ctime.days(dob) ge yrmoda(1950, 6, 30) filter1 = 1.
list.
* filter by filter1.
id  expt_date        dob day month year      year1  filter1 
 
 1 02/02/2006 06/09/1956  23   11  1997 01/01/1907     1.00 
 2 03/02/2005 05/07/1966  17    9  1985 09/05/1908     1.00 
 3 07/14/2005 11/11/1911  30   12  2008 09/03/1912      .00 
 4 12/06/2006 02/08/1922   5    5  2004 02/07/1916      .00 
 5 08/27/2007 03/14/1974   9    9  1999 11/18/1980     1.00 
 
Number of cases read:  5    Number of cases listed:  5

The extraction functions

Below we illustrate the use of some extraction functions.  In the following examples, we use the xdate.year function to extract the year from each variable, and then do the subtraction of the two dates.  The variable diff was created above as the difference between each subject's date of birth (dob) and the date of the experiment (expt_date).  In the first example, the variable diff is used in the xdate.year function to recalculate the subjects' age (by subtracting 1582, the first year of the Gregorian calendar).  The second compute command creates the variable age2 by using the xdate.year function to subtract the year of the subjects' birth from the year of the experiment date.  As you can see, you get slightly different results depending on you create the variable (look at the values of age1 and age2 in the last row). 

compute age1 = xdate.year(diff) - 1582.
compute age2 = xdate.year(expt_date) - xdate.year(dob).
exe.
formats diff (f16.2).
list expt_date dob diff age age1 age2.
 expt_date        dob             diff      age     age1     age2 
 
02/02/2006 06/09/1956    1566864000.00    49.65    50.00    50.00 
03/02/2005 05/07/1966    1225065600.00    38.82    39.00    39.00 
07/14/2005 11/11/1911    2956089600.00    93.67    94.00    94.00 
12/06/2006 02/08/1922    2676844800.00    84.82    85.00    84.00 
08/27/2007 03/14/1974    1055721600.00    33.45    34.00    33.00 
 
Number of cases read:  5    Number of cases listed:  5

Let's illustrate some of the other extraction functions.  The xdate.week function is used to create the variable num_weeks, which is the number of weeks from the beginning of the year to the date given in the variable expt_date.  The xdate.month function is used to create the variable month_num, which is the number of the month, and the xdate.quarter function is used to create the variable qtr, which is the quarter of the year.

compute num_weeks = xdate.week(expt_date).
compute month_num = xdate.month(expt_date).
compute qtr = xdate.quarter(expt_date).
list expt_date num_weeks month_num qtr.
 expt_date num_weeks month_num      qtr 
 
02/02/2006      5.00      2.00     1.00 
03/02/2005      9.00      3.00     1.00 
07/14/2005     28.00      7.00     3.00 
12/06/2006     49.00     12.00     4.00 
08/27/2007     35.00      8.00     3.00 
 
Number of cases read:  5    Number of cases listed:  5

The date difference functions

The date difference functions can be used to obtain the difference in integers between two dates.  Note that the first two arguments must be variables that have been specified as dates.  If one of the variables is not specified as a date variable (it is just input as a regular numeric variable), the function does not work as expected.  The third argument (given in quotes) indicates the unit of time that you would like.  You can specify years, quarters, months, weeks, days, hours, minutes or seconds.

compute diff_year = datediff(expt_date, year1, "years").
compute diff_weeks = datediff(expt_date, year1, "weeks").
formats diff_date diff_weeks (f4.0).
list expt_date year1 diff_date  diff_weeks.
 expt_date      year1 diff_date diff_weeks 
 
02/02/2006 01/01/1907      99      5170 
03/02/2005 09/05/1908      96      5034 
07/14/2005 09/03/1912      92      4845 
12/06/2006 02/07/1916      90      4739 
08/27/2007 11/18/1980      26      1396 
 
Number of cases read:  5    Number of cases listed:  5

The date increment function

The date increment function (called datesum) can be used to "add" or "subtract" specified increments of time to a date.  In our examples, we will use the date variable expt_date.  This function requires three arguments (a fourth argument is optional).  The first argument is the date variable, the second is the number of units (either positive or negative), and the third argument is the unit of time (given in quotes).  The first compute command creates a new variable called ds_days that is five days after the value of expt_date.  The second compute command creates a variable called ds_months, which is two months after the value of expt_date.  The third compute command creates a variable called ds_years, which is 10 years before the value of expt_date.  The formats command is used to format the three new variables as American dates with a length of 10.

compute ds_days = datesum(expt_date, 5, "days").
compute ds_months = datesum(expt_date, 2, "months").
compute ds_years = datesum(expt_date, -10, "years").
formats ds_days ds_months ds_years (adate10).
list expt_date ds_days ds_months ds_years.
 expt_date    ds_days  ds_months   ds_years 
 
02/02/2006 02/07/2006 04/02/2006 02/02/1996 
03/02/2005 03/07/2005 05/02/2005 03/02/1995 
07/14/2005 07/19/2005 09/14/2005 07/14/1995 
12/06/2006 12/11/2006 02/06/2007 12/06/1996 
08/27/2007 09/01/2007 10/27/2007 08/27/1997 
 
Number of cases read:  5    Number of cases listed:  5

How to cite this page

Report an error on this page or leave a comment

The content of this web site should not be construed as an endorsement of any particular web site, book, or software product by the University of California.