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