Sas разница в днях между датами
Обновлено: 18.05.2024
Я уже некоторое время занимаюсь практиками и упражнениями в студии SAS. В дополнение к тому, что SAS Studio свободна и лучше выглядит, Есть ли какая-то другая разница, которая делает SAS Studio лучшим выбором, чем SAS Enterprise? Помимо HTML, работающего в cloud, есть ли какая-то функциональная.
В SAS, при использовании в предложении WHERE, есть ли какая-либо разница между WHERE col1 is MISSING против WHERE col1 is NULL Можете ли вы объяснить, ссылаясь на случай, когда col1 является char и когда col1 является числовым?
Ваши даты не являются литералами даты SAS. литералы даты SAS принимают формат 'DDMMMYYYY'd или 'DDMMMYY'd , например, 01JAN2018'd или 01JAN18'd .
Вы поместили кавычки вокруг своих макропеременных, которые объявляют даты, и поместили двойные кавычки вокруг них во второй раз при вызове intck.
& должен иметь префикс days .
Приведенный ниже код решает эти проблемы:
Поскольку вы вычисляете количество месяцев между январем 2017 года и декабрем 2017 года, я переименовал вашу переменную макроса в months .
Я думаю, вы хотите сделать это в явном SQL проходе. для этого вам нужно что-то вроде этого, и вы можете использовать определенные функции Teradata.
Похожие вопросы:
Я новичок в SAS и хотел бы знать, в чем разница между утверждениями если-то и IF-THEN-DO в SAS?
В чем разница с точки зрения того, что я прошу выполнить движок SAS между этими тремя образцами кода? ОБРАЗЕЦ А PROC SQL; CREATE TABLE foo AS SELECT aaa FROM table1 ; CREATE TABLE bar AS SELECT aaa.
Я использую pc sas 9.4. Но сервер находится на Linux, поэтому вместо того, чтобы запускать мою программу в пакетном режиме на сервере, у меня есть небольшой скрипт, который я запускаю в верхней.
Я уже некоторое время занимаюсь практиками и упражнениями в студии SAS. В дополнение к тому, что SAS Studio свободна и лучше выглядит, Есть ли какая-то другая разница, которая делает SAS Studio.
В SAS, при использовании в предложении WHERE, есть ли какая-либо разница между WHERE col1 is MISSING против WHERE col1 is NULL Можете ли вы объяснить, ссылаясь на случай, когда col1 является char и.
У меня есть данные, которые выглядят так в SAS; Date Type_1 Type_2 4/8/2015 21654.72 . 4/9/2015 34490.13 . 4/9/2015 32429 . 4/9/2015 . 24438.76 4/9/2015 . 54043.18 4/9/2015 . 58969.06 4/9/2015 .
В чем разница между импортом большого файла csv в SAS с помощью кода и использованием мастера импорта (точка и щелчок)? Данные импортируются в SAS быть по-другому?
я готовлюсь к базовому экзамену SAS, у меня медицинское образование. Я намерен выучить SAS клинический. в чем разница между операторами invalue и value .
Я бы начал ft в одной компании, где мне сказали, что приложение разработано с использованием 'Sas' и 'salesforce'. В чем разница между ними? И какие рекомендуются интернет-ресурсы, которые я могу.
call missing(of x1-x2);
call missing (of _all_);
call missing (of _char_);
SAS может зачитывать даты практически любого формата, как, например, такие:
Дата | Описание |
---|---|
10/21/1950 | Month/Day/Year |
21-10-1950 | Day-Month-Year |
21Oct1950 | Day Month Abbreviation Year |
50294 | Julian Date |
Однако все они хранятся в SAS как число, а именно, количество дней с 1 Января 1960 года (все даты, после этой – это положительные числа, до - отрицательные). Вот пример как в SAS хранятся даты:
Дата | SAS значение |
---|---|
January 1, 1960 | 0 |
January 2, 1960 | 1 |
December 31, 1959 | -1 |
June 15, 2006 | 16967 |
October 21, 1950 | -3359 |
Давайте теперь познакомимся с некоторыми часто используемыми форматами для даты. Для этого рассмотрим следующий отрывок кода
Как мы уже с вами знаем, значение 1 в SAS соответствует дате 2 Января 1960. Однако, накладывая формат на переменную date, мы можем менять внешний вид этой даты. Давайте посмотрим на самые часто используемые форматы и то, как будет выглядеть одна и та же дата под разными форматами.
Название формата | Результат |
---|---|
date9. | 02JAN1960 |
date. | 02JAN60 |
is8601da. | 1960-01-02 |
ddmmyy10. | 02/01/1960 |
ddmmyy8. | 02/01/60 |
ddmmyy. | 02/01/60 |
mmddyy10. | 01/02/1960 |
mmddyy. | 01/02/60 |
yymmdd6. | 600102 |
yymmdd8. | 60-01-02 |
yymmdd10. | 1960-01-02 |
Особое внимание следует обратить на эти два формата: ddmmyy. и mmddyy. Бывают случаи, когда их можно перепутать. В частности, если в данных не встретилось дня больше 12, тогда сложно понять, что же тут день, а что месяц. В таких ситуациях, всегда лучше перестраховаться и уточнить.
Бывают случаи, когда вам нужно руками ввести какую-то определенную дату, чтобы что-то посмотреть, или проверить, или это какая-то значимая дата внутри проекта и вам нужно ее часто использовать и т.д. Например, это 06JUL1991. Согласитесь, навскидку и не скажешь сколько же это дней после 01JAN1960. Было бы странным, если бы SAS не оставил нам возможности ввести дату, как число, которое хранится в SAS, однако на понятном человеку языке. Я думаю, что было бы немало проблем, если всякий такой раз нужно было отдельно вычислять разницу с 01JAN1960 и вводить дату только как целое число. Для того, чтобы ввести дату, но чтобы SAS понял, что это именно дата, а не что-то другое, необходимо записать ее как date constant:
Давайте проверим, что же из этого получится.
Как видим, SAS распознал, что это дата и хранит ее как целое число. К сожалению, для date constant есть некоторые требования. Она обязательно должна выглядеть следующим образом: <1-2 цифры дня> <трехбуквенная аббревиатура месяца> <2 или 4 цифры года> в одинарных или двойных кавычках после чего d или D. Т.е. такую запись ‘01/06/1991’d SAS не распознает и в придачу ругнется на вас в логе.
А теперь давайте представим следующую ситуацию. Допустим, пациенту измерили давление в тот же день когда он принял исследуемый препарат. И представим даже, что давление это оказалось не совсем в норме. И вот тут вам важно очень знать, измерили давление до приема лекарства или после. Ведь если после, то, возможно, повышение давления связано именно с приемом этого лекарства. В таком случае вам нужно время замера и время приема лекарства. На практике, работать с датой/временем приходится очень часто, поэтому давайте поговорим о времени в SAS.
Посмотрим, чему соответствует 0, 1, 2 в SAS, наложи мы на него формат datetime16.
SAS значение | Дата/Время |
---|---|
0 | 01JAN60:00:00:00 |
1 | 01JAN60:00:00:01 |
2 | 01JAN60:00:00:02 |
Как видим, мы уже имеем другие значения, не те, что были в примере с датами. Это говорит нам о том, что накладывая формат или делая какие-либо преобразования с датами, мы должны четко понимать, что именно хранится в переменной, иными словами, чему будет соответствовать единица – первой секунде первого января 60 года, или второму января 60 года.
После того, как мы убедились, что в нашей переменной хранится значение datetime, давайте посмотри, как будет выглядеть значение 20000 под разными форматами.
Название формата | Результат |
---|---|
datetime. | 01JAN60:05:33:20 |
datetime16. | 01JAN60:05:33:20 |
datetime14. | 01JAN60:05:33 |
is8601dt. | 1960-01-01T05:33:20 |
dateampm. | 01JAN60:05:33:20 AM |
hhmm. | 5:33 |
time. | 5:33:20 |
time5. | 5:33 |
is8601tm. | 05:33:20 |
tod. | 05:33:20 |
tod5. | 05:33 |
Вполне естественно, что в SAS существуют некоторые функции, направленные на работу с датами/временем и только. Давайте познакомимся с некоторыми из них.
YRDIF(start-date, end-date, <basis>), где:
- start-date – начальная дата
- end-date – конечная дата
- <basis> – опциональный аргумент, который указывает как именно считать эту разницу. Чаще всего используется 'ACT/ACT', который говорит SAS использовать реальное количество дней в каждом месяце, а также учитывать високосный год.
WEEKDAY(date), где:
day(date), где:
month(date), где:
year(date), где:
mdy(month,day,year), где:
- month, day, year – числа либо переменные, задающие месяц, день и год
intck(interval,start-date,end-date), где:
- interval – интересующий нас интервал, например, year, semi-year (полугодие), qtr (квартал), month, week, weekday (по умолчанию week без Sunday and Saturday)
- start-date – начальная дата
- end-date – конечная дата
Давайте рассмотрим несколько примеров того, как именно работает эта функция:
Expression | Value Returned |
---|---|
intck('year', '01Jan2005'd, '31Dec2005’d) | 0 |
intck ('year', '31Dec2005'd, '01Jan2006’d) | 1 |
intck ('month', '01Jan2005'd, '31Jan2005'd) | 0 |
intck ('month', '31Jan2005'd, '01Feb2005'd) | 1 |
intck ('qtr', '25Mar2005'd, '15Apr2005'd) | 1 |
Как мы видим, в первом случае intck вернет нам значение 0, т.к. обе даты – в пределах одного календарного года, в то время как во втором случае мы один раз пересекли границу интервала и в итоге получили значение 1. Аналогично с интервалами month и qtr.
Все ниже рассмотренные функции работают с календарными типами данных.
Получение текущей даты и времени.
Чтобы получить текущую дату и время используется функция NOW ().
SELECT NOW ()
Результат: 2015-09-25 14:42:53
Для получения только текущей даты есть функция CURDATE ().
SELECT CURDATE ()
Результат: 2015-09-25
И функция CURTIME (), которая возвращает только текущее время:
SELECT CURTIME ()
Результат: 14:42:53
Функции CURDATE () и NOW () удобно использовать для добавления в базу данных записей, для которых требуется хранить дату добавления. Например, при добавлении статьи на сайт хорошо бы хранить ее дату публикации. Тогда запрос на добавление статьи в базу будет примерно таким:
Прибавление и вычитание дат и времени
Функция ADDDATE (date, INTERVAL value) прибавляет к дате date значение value и возвращает полученное значение. В качестве value могут выступать следующие значения:
- SECOND — секунды
- MINUTE — минуты
- HOUR — часы
- DAY — дни
- WEEK — недели
- MONTH — месяцы
- QUARTER — кварталы
- YEAR — годы
а также их комбинации:
- MINUTE_SECOND — минуты и секунды
- HOUR_SECONDчасы — минуты и секунды
- HOUR_MINUTE — часы и минуты
- DAY_SECOND — дни, часы, минуты и секунды
- DAY_MINUTE — дни, часы и минуты
- DAY_HOUR — дни и часы
- YEAR_MONTH — года и месяцы.
Функция SUBDATE (date, INTERVAL value) производит вычитание значения value из даты date . Пример:
Функция PERIOD_ADD (period, n) прибавляет к значению period n месяцев. Значение период должно быть представлено в формате YYYYMM (например сентябрь 2015 года будет 201509). Пример:
SELECT PERIOD_ADD (201509, 4)
Результат: 201601
Функция TIMESTAMPADD (interval, n, date) прибавляет к дате date временной интервал n , значения которого задаются параметром interval . Возможные значения параметра interval:
- FRAC_SECOND — микросекунды
- SECOND — секунды
- MINUTE — минуты
- HOUR — часы
- DAY — дни
- WEEK — недели
- MONTH — месяцы
- QUARTER — кварталы
- YEAR — годы
Функция SUBTIME (date, time) вычитает из даты date время time. Пример:
Вычисление интервала между датами
Функция TIMEDIFF (date1, date2) вычисляет разницу в часах, минутах и секундах между двумя датами date1 и date2 . Пример:
Функция DATEDIFF (date1, date2) вычисляет разницу в днях между двумя датами, при этом часы, минуты и секунды при указании дат игнорируются. Пример:
С помощью этой функции легко определить сколько дней прошло с даты публикации статьи:
SELECT DATEDIFF (CURDATE (), date_publication) FROM posts WHERE id_post = 1
Функция PERIOD_DIFF (period1, period2) вычисляет разницу в месяцах между двумя датами. Даты должны быть представлены в формате YYYYMM . Например, узнаем сколько месяцев прошло с января 2015 по сентябрь 2015:
SELECT PERIOD_DIFF (201509, 201501)
Результат: 9
Функция TIMESTAMPDIFF (interval, date1, date2) вычисляет разницу между датами date2 и date1 в единицах указанных в параметре interval . При этом interval может принимать следующие значения:
- FRAC_SECOND — микросекунды
- SECOND — секунды
- MINUTE — минуты
- HOUR — часы
- DAY — дни
- WEEK — недели
- MONTH — месяцы
- QUARTER — кварталы
- YEAR — годы
Получение различных форматов даты и времени и другой информации
Функция DATE (datetime) возвращает дату, отсекая время. Пример:
Функция TIME (datetime) возвращает время, отсекая дату. Пример:
Функция TIMESTAMP (date) возвращает полный формат со временем даты date . Пример:
DAY (date) и DAYOFMONTH (date). Функции-синонимы, которые возвращают порядковый номер дня месяца. Пример:
Функции DAYNAME (date), DAYOFWEEK (date) и WEEKDAY (date). Первая функция возвращает название дня недели, вторая — номер дня недели (отсчет от 1 — воскресенье до 7 — суббота), третья также номер дня недели только другой отсчет(отсчет от 0 — понедельник, до 6 — воскресенье). Пример:
Функции WEEK (date) и WEEKOFYEAR (datetime). Обе функции возвращают номер недели в году, только у первой неделя начинается с воскресенья, а у второй с понедельника. Пример:
Функция MONTH (date) возвращает числовое значение месяца (от 1 до 12), а MONTHNAME (date) название месяца. Пример:
Функция QUARTER (date) возвращает номер квартала года (от 1 до 4). Пример:
Функция YEAR (date) возвращает значение года (от 1000 до 9999). Пример:
Функция DAYOFYEAR (date) возвращает порядковый номер дня в году (от 1 до 366). Прмиер:
Функция HOUR (datetime) возвращает значение часа (от 0 до 23). Пример:
Функция MINUTE (datetime) возвращает значение минут (от 0 до 59). Пример:
Функция SECOND (datetime) возвращает значение секунд (от 0 до 59). Пример:
Функция EXTRACT (type FROM date) возвращает часть даты date определяемую параметром type . Пример:
Взаимообратные функции TO_DAYS (date) и FROM_DAYS (n). Первая преобразует дату в количество дней, прошедших с нулевого года. Вторая, наоборот, принимает число дней, прошедших с нулевого года и преобразует их в дату. Пример:
Взаимообратные функции UNIX_TIMESTAMP (date) и FROM_UNIXTIME (n). Первая преобразует дату в количество секунд, прошедших с 1 января 1970 года. Вторая, наоборот, принимает число секунд, с 1 января 1970 года и преобразует их в дату. Пример:
Взаимообратные функции TIME_TO_SEC (time) и SEC_TO_TIME (n). Первая преобразует время в количество секунд, прошедших от начала суток. Вторая, наоборот, принимает число секунд с начала суток и преобразует их во время. Пример:
Функция MAKEDATE (year, n) принимает год year и номер дня в году n и преобразует их в дату. Пример:
Результат – 100 минут.
В запросе используется стандартное представление даты (ISO) в виде текстовой строки 'yyyy-mm-ddThh:mm:ss', которое не зависит ни от локальных настроек сервера, ни и от самого сервера.
MySQL
Функция DATEDIFF есть и в MySQL, однако она имеет совсем другой смысл. DATEDIFF вычисляет число дней между двумя датами, являющихся аргументами этой функции. При этом если дата представлена в формате дата-время, используется только составляющая даты. Поэтому все три нижепредставленных запроса дадут один и тот же результат -1. Положительный результат будет получен, если первый аргумент больше второго.
Один день мы получим даже в случае, если интервал между датами составляет все одну секунду:
Решение же нашей задачи можно получить при помощи другой встроенной функции – TIMESTAMPDIFF, которая аналогичная функции DATEDIFF в Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server:
PostgreSQL
В PostgreSQL нет функции, подобной DATEDIFF (SQL Server) или TIMESTAMPDIFF (MySQL). Поэтому для решения задачи можно применить следующую последовательность действий:
- представить разность между двумя датами интервалом;
- посчитать число секунд в интервале;
- поделить полученное на шаге 2 значение на 60, чтобы выразить результат в минутах.
Для получения интервала можно взять разность двух значений темпорального типа, При этом требуется явное преобразование типа:
Результат - "01:40:00", который есть не что иное, как один час и сорок минут.
Можно также воспользоваться встроенной функцией AGE , которая выполняет заодно неявное преобразование типа своих аргументов:
Для получения числа секунд в интервале воспользуемся функцией
Значение интервала представим последним способом как наиболее коротким. Для получения окончательного решения задачи поделим полученный результат на 60:
В данном случае мы имеем результат, выраженный целым числом, поскольку оба значения времени в задаче не содержали секунд. В противном случае, будет получено десятичное число, например: 99.75:
Oracle
Oracle тоже не имеет в своем арсенале функции типа DATEDIFF. Кроме того, Oracle не поддерживает стандартное текстовое представление даты/времени.
Мы можем посчитать интервал в минутах, приняв во внимание, что разность дат (значений типа date ) в Oracle дает в результате число дней (суток). Тогда для вычисления интервала в минутах нужно просто разность дат умножить на 24 (число часов в сутках), а затем на 60 (число минут в часе):
Читайте также: