## 3 Ways to Create a SAS Date / Time

By : - The SAS language uses it’s own time scale. First, let’s get a reminder on SAS date, time and datetime concepts. Then, we will see three options to convert or create these values.

## 1. Reminder on SAS date, time and datetime

Date: A SAS date is an integer equal to the number of days since the 1st of January 1960.  Dates before 1960 are negative values. The 1st of January 1960 is equal to zero. So the difference between two SAS dates is a number of days.

Time: A SAS time is a number representing the number of seconds since midnight. It varies from 0 to 86400 (60 seconds * 60 minutes *24 hours). The difference between two SAS time is a number of seconds.

Datetime: A SAS datetime is a number represent the number of seconds since the 1st of January 1960. This number will have a decimal value if  tenth of seconds are used. But it remains the exception. The difference between two SAS datetime is a number of seconds.

Variables which contain date, time or datetime are numeric variables.

Benefit: Numbers require less storage space. Compute with these numbers is easier. In addition, the SAS functions work with those numeric values. For example, the `month` function extract the month of a SAS date.

Inconvenient and workaround: these date/time/datetime cannot be interpret straight forward by a human eye. To solve this issue, you can apply a format it or create a character variable using the put function and the format. No further detail is given here on this topic.

## 2. The difference with Excel

Date: While the 1st janvier 1960 stands for the the SAS date zero, the 1st 1900 is used by Excel one (not zero). To go from an Excel date to a SAS date, we need to add 21916.

`sas_date = excel_date * 21916;`

Time: Here again, there is a difference between a SAS time and an Excel time. A hour in Excel is a number between 0 and 1. a time in SAS is a number between 0 and 86400 i.e. 60 seconds x 60 minutes x 24 hours. 12pm is the equivalent of 0.5 in Excel (half day through) whereas it is 60 (seconds) x 60 (minutes) x 12 (hours) i.e. 43200 seconds in SAS time. To go from an Excel hour to a SAS hour, you just need to multiply the Excel hour by 86400 (seconds).

`sas_time = excel_time * 86400;`

There is no negative values in Excel. After one day, the day information is lost: 16 hours + 10 hours = 2am in Excel whereas in SAS language it is 26 hours (60x60x26).

Datetime: Maintenant, combinons les deux solutions pour convertir une valeur datetime d’Excel en datetime SAS.

`sas_date_time = (excel_date_time - 21916 ) * 86400;`

## 3. Create a SAS date/time/datetime with `mdy`, `hms` and `dhms` functions

Create a date with the `mdy` function: the `mdy` function creates a SAS date. In the US, the month appears first in a date in the US follow with the day and month. The same order is used by the three numeric parameters of this function: the month, the day and the year. The name of the function `mdy` recalls this order too: M for month, D for day and Y for year.

`visit_dt = mdy(visit_m,visit_d,visit_y);`

Create a time with `has` function: the `hms` function returns a SAS time. It includes the hours, minutes and seconds.

`visit_hour = hms(vist_hr,visit_min,visit_sec);`

Create a datetime with the `ohms` function: the `dhms` function has 4 paramètres : the SAS date, the number of hours, the number of minutes and the number of seconds.

`visit_time = dhms(visit_dt, vist_hr,visit_min,visit_sec);`

## 4. Create a date/time/datetime using the `input` function and an informat

We can read a character value and ask the system to interpret it as a SAS date using an informat in an `input` function. The first parameter is either a character value into quotes or a character variable. The second parameter is the informat.

`date.` informat: one of the frequently used display for a date is: the day followed by three letters for the month name in English and the 4-digit year. The total length is of 9 characters. The informat is called `date9.`

`newdate = input('25NOV1952',date9.);`

By default, the informat `date.` has for value 7 (`date7.`) which gives a date with a two-digit year. Be careful with the `year cutoff` global option which will either give 1952 or 2052 depending of its setting. Check section 5 for more details on this option.

`nov_dt = input('25NOV52',date7.);`

`time.` informat: the `time.` informat has by default a value of 8. So `time.` and `time8.` are equivalent. For clarity reason, I tend to add the number in my code.

`newhour = input('08:15:00',time8.);`

If you don’t have any second, you can use `time5.`

`newhour = input('12:15',time5.);`

`datetime.` informat : the default value for a DATETIME. informat is 18. So datetime. and datetime18. are equivalent.

`day_hour = input('25NOV1952:08:15:10',datetime18.);`

## 5. The `yearcutoff` Option

Identify the current value of `yearcutoff`: to find out what is the yearcutoff, go and check the log after running this code :

```proc options;
run;```

Change the year cutoff: to change this value, use the global options staffent and the word `yearcutoff`.

`options yearcutoff=1950;`

Interpretation: If `yearcutoff = 1920`, then :

• Any year smaller than 20 is interpreted as year 2000: 20xx.
• Any year greater than or equal to 20 will be interpreted as a year 1900 : 19xx.

## 6. Write manually a few date/time/datetime

A quick way to create a SAS date, if and only if, we have very values to enter, is tu use `d`, `t` ou `dt` depending on whether it is a date a time or a datetime.

```x_date     = '25NOV1952'd;
x_time     = '08:15:00't;
x_datetime = '25NOV1952:08:15:10'dt;```