DATEPART() в sqldf

Можно ли использовать типичную для SQL Server 2008 DATEPART() команду SQL в sqldf?

Я просматриваю документацию, но не нахожу ничего, связанного с ней, я не знаком с SQLite, поэтому, если я должен пойти по этому пути и прочитать, я буду

Я хочу сделать что-то простое, например:

sqldf("select DISCHARGE_UNIT,
      round(avg(datepart(hour,order_time)),2) `avg order time`
      from data
      group by DISHCHARGE_UNIT)

ИЗМЕНИТЬ

summary(data)


 DISCHARGE.UNIT 
 4SOU   :1295  
 2CAD   :1250  
 2NOR   :1185  
 4NOR   :1144  
 3NOR   :1125  
 3SOU   :1080  
 (Other):2723  
      ORDER.DATE         ORDER.TIME  
 1800-01-01:1213   12:00:00 AM:1213  
 1/4/2013  :  39   11:42:00 AM:  34  
 12/5/2012 :  36   11:51:00 AM:  34  
 2/15/2013 :  35   11:03:00 AM:  32  
 12/19/2012:  33   10:32:00 AM:  29  
 10/25/2012:  31   11:15:00 AM:  29  
 (Other)   :8415   (Other)    :8431 

dput(head(data))
ORDER.TIME = structure(c(734L, 118L, 
    279L, 176L, 268L, 188L), .Label = c("1:00:00 PM", "1:01:00 PM", 
    "1:02:00 PM", "1:03:00 PM", "1:04:00 PM", "1:05:00 PM", "1:06:00 PM", 
    "1:07:00 PM", "1:08:00 PM", "1:09:00 PM", "1:10:00 PM", "1:11:00 PM", 
    "1:12:00 PM", "1:13:00 PM", "1:14:00 PM", "1:15:00 PM", "1:16:00 PM", 
    "1:17:00 PM", "1:18:00 PM", "1:19:00 PM", "1:20:00 PM", "1:21:00 PM", 
    "1:22:00 PM", "1:23:00 PM", "1:24:00 PM", "1:25:00 PM", "1:26:00 PM", 
    "1:27:00 PM", "1:28:00 PM", "1:29:00 PM", "1:30:00 PM", "1:31:00 PM", 
    "1:32:00 PM", "1:33:00 PM", "1:34:00 PM", "1:35:00 PM", "1:36:00 PM", 
    "1:37:00 PM", "1:38:00
ORDER.DATE = structure(c(297L, 352L, 340L, 299L, 400L, 185L
    ), .Label = c("1/1/2013", "1/10/2013", "1/11/2013", "1/12/2013", 
    "1/13/2013", "1/14/2013", "1/15/2013", "1/16/2013", "1/17/2013", 
    "1/18/2013", "1/19/2013", "1/2/2013", "1/20/2013", "1/21/2013", 
    "1/22/2013", "1/23/2013", "1/24/2013", "1/25/2013", "1/26/2013", 
    "1/27/2013", "1/28/2013", "1/29/2013", "1/3/2013", "1/30/2013", 
    "1/31/2013", "1/4/2013", "1/5/2013", "1/6/2013", "1/7/2013", 
    "1/8/2013", "1/9/2013", "10/1/2012", "10/1/2013", "10/10/2012", 
    "1

Спасибо,


person MCP_infiltrator    schedule 24.01.2014    source источник
comment
Пожалуйста, приведите воспроизводимый пример.   -  person Sven Hohenstein    schedule 24.01.2014
comment
Sven Прошу прощения, пожалуйста, дайте мне знать, достаточно ли того, что у меня есть сейчас, или вам нужно, чтобы я добавил что-то еще.   -  person MCP_infiltrator    schedule 24.01.2014
comment
Похоже, что ORDER.DATE имеет неправильный формат. Пожалуйста, опубликуйте вывод dput(head(data)).   -  person Sven Hohenstein    schedule 24.01.2014
comment
Показанный вывод dput дает ошибку при вставке обратно - исправьте. Функции даты/времени SQLite описаны здесь: sqlite.org/lang_datefunc.html   -  person G. Grothendieck    schedule 25.01.2014
comment
@ G.Grothendieck спасибо за ссылку на документацию sqlite, я не вернусь к работе до понедельника, поэтому я не могу вставить вывод dput обратно, надеюсь, ваша ссылка решит проблему.   -  person MCP_infiltrator    schedule 25.01.2014


Ответы (1)


DATEPART(...) является частью Transact-SQL, которая является собственностью Microsoft и Sybase, поэтому нет, она не поддерживается в sqldf.

sqldf работает путем создания временной базы данных на основе механизма, определенного в аргументе drv=. Поэтому любая версия SQL, поддерживаемая этим движком, должна поддерживаться sqldf. См. в документации список поддерживаемых движков. Если вы не укажете механизм, он поддерживает словарь, определенный в SQLite, который является подмножеством стандартного языка SQL (документация здесь).

Одна из проблем в вашем примере заключается в том, что ваши значения ORDER_TIME используют 12-часовой формат времени. SQLite поддерживает ISO-8601, для которого требуется 24-часовой формат. Итак, в вашем конкретном случае единственный вариант, который я могу придумать, - это создать столбец HOURS в R и использовать его при вызове sqldf(...).

library(sqldf)
# create sample data...
set.seed(1)
# ORDER_TIME in 12-hour format; does not conform with ISO-8601
data <- data.frame(ORDER_TIME=strftime(as.POSIXct("1:00:00",format="%H:%M:%S")+seq(12*3600,24*3600,60),format="%I:%M:%S %p"),
                   ORDER.DATE=strftime(as.Date("2013-01-01")+rep(0:30,each=721),format="%m/%d/%Y"),
                   DISCHARGE_UNIT=sample(1:10,721,replace=T))

# add hours column based on ORDER_TIME
data$HOURS <- as.numeric(strftime(as.POSIXct(data$ORDER_TIME,format="%I:%M:%S %p"),format="%H"))
sqldf("select DISCHARGE_UNIT,
      round(avg(HOURS),2) `avg order time`
      from data
      group by DISCHARGE_UNIT")
#    DISCHARGE_UNIT avg order time
# 1               1          16.91
# 2               2          16.69
# 3               3          16.64
# 4               4          17.10
# 5               5          15.78
# 6               6          15.01
# 7               7          17.09
# 8               8          15.12
# 9               9          17.68
# 10             10          17.17

Если ваши данные о времени были в 24-часовом формате (кстати, настоятельно рекомендуется), вы могли бы использовать SQLite функции даты и времени:

set.seed(1)
# ORDER_TIME in 24-hour format; conforms to ISO-8601
data <- data.frame(ORDER_TIME=strftime(as.POSIXct("1:00:00",format="%H:%M:%S")+seq(12*3600,24*3600,60),format="%H:%M:%S"),
                   ORDER.DATE=strftime(as.Date("2013-01-01")+rep(0:30,each=721),format="%m/%d/%Y"),
                   DISCHARGE_UNIT=sample(1:10,721,replace=T))
sqldf("select DISCHARGE_UNIT,
      round(avg(strftime('%H',ORDER_TIME)),2) `avg order time`
      from data
      group by DISCHARGE_UNIT",drv="SQLite")
#    DISCHARGE_UNIT avg order time
# 1               1          16.91
# 2               2          16.69
# 3               3          16.64
# 4               4          17.10
# 5               5          15.78
# 6               6          15.01
# 7               7          17.09
# 8               8          15.12
# 9               9          17.68
# 10             10          17.17
person jlhoward    schedule 25.01.2014
comment
спасибо за подробный ответ, в понедельник попробую, также спасибо за ссылки на документацию, я привык к SQL, но никогда не использовал SQLite - person MCP_infiltrator; 26.01.2014