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:

Давайте проверим, что же из этого получится.

Lesson2.3.1

Как видим, 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). Поэтому для решения задачи можно применить следующую последовательность действий:

  1. представить разность между двумя датами интервалом;
  2. посчитать число секунд в интервале;
  3. поделить полученное на шаге 2 значение на 60, чтобы выразить результат в минутах.

Для получения интервала можно взять разность двух значений темпорального типа, При этом требуется явное преобразование типа:

Результат - "01:40:00", который есть не что иное, как один час и сорок минут.

Можно также воспользоваться встроенной функцией AGE , которая выполняет заодно неявное преобразование типа своих аргументов:

Для получения числа секунд в интервале воспользуемся функцией

Значение интервала представим последним способом как наиболее коротким. Для получения окончательного решения задачи поделим полученный результат на 60:

В данном случае мы имеем результат, выраженный целым числом, поскольку оба значения времени в задаче не содержали секунд. В противном случае, будет получено десятичное число, например: 99.75:

Oracle

Oracle тоже не имеет в своем арсенале функции типа DATEDIFF. Кроме того, Oracle не поддерживает стандартное текстовое представление даты/времени.

Мы можем посчитать интервал в минутах, приняв во внимание, что разность дат (значений типа date ) в Oracle дает в результате число дней (суток). Тогда для вычисления интервала в минутах нужно просто разность дат умножить на 24 (число часов в сутках), а затем на 60 (число минут в часе):

Читайте также: