2016-11-28 8 views
1

Мой запрос что-то вроде ...Informix - между двумя датами

SELECT * FROM table WHERE datetime BETWEEN two_sundays_ago AND last_sunday 

Я просмотрел функции даты/времени от IBM (link), а также какой-либо другой документации, но я изо всех сил, чтобы понять, как делать две вещи.

  1. Во-первых, как отрегулировать разницу часовых поясов (вычесть 6 из часового значения) в то же время сохраняя остальную часть значения даты и времени. Тип datetime - DATETIME YEAR FOR FRACTION (3).

  2. Во-вторых, как получить два значения даты, two_sundays_ago и last_sunday. Например, если сегодня понедельник 11/28/16, я бы хотел, чтобы запрос выбирал значения между 11/20/16 и 11/27/16.

Я делал это в ЗАЯВКАХ с выражением =DateAdd("h",6,DateAdd("d",-Weekday(Now())-6,Today)) для two_sundays_ago, но в этом запросе я суммируя значения, так что я понимаю, что я не могу выбрать значение даты и время для фильтрации с позже.

+0

(1) Что вы имеете в виду под "настроить разницу часовых поясов? Какой часовой пояс? Как система знает, какой часовой пояс? Короткий ответ заключается в добавлении или вычитании соответствующего интервала: ± INTERVAL (4:30) HOUR TO MINUTE для дельта 4 часа, 30 минут. (2) В воскресенье, 27 ноября, соответствующие даты: воскресенье, 13 ноября и воскресенье, 20 ноября? В понедельник 28 ноября соответствующие даты - воскресенье, 20 ноября и воскресенье 27 ноября? А в субботу, 26 ноября, соответствующие даты также являются 13-м и 20-м? (3) Непонятно, что вы пытаетесь; пожалуйста, покажите некоторый SQL для сводных материалов. –

+0

Джон, правильно, почти все, что вы сказали, верно. Я не уверен, что вы знакомы с BIDS, но я в основном пытаюсь написать эквивалент = DateAdd (и т. Д. См. Пост) для Informix. Я просто пытаюсь захватить информацию с прошлой недели на основе любой текущей даты, а также отрегулировать разницу в часовом поясе в процессе. – esafresa

+0

SELECT * FROM table WHERE datetime BETWEEN (today-weekday-7) AND (today-weekday) .. .. тип datetime - DATETIME YEAR TO FRACTION (3). А затем нужно настроить часовой пояс. БД находится в UTC, и мы находимся в Центральном времени – esafresa

ответ

1

Я думаю, что вы получите пользу от того, функции, которая реализует вариант MOD где variant_MOD(i, j) возвращает значение в диапазоне 1..j вместо 0..j-1 - когда значение из MOD(i, j) будет 0, она возвращает j вместо этого. Не обращая внимания на отрицательные значения, это jmod() делает работу:

CREATE FUNCTION jmod(n INTEGER, m INTEGER) RETURNING INTEGER AS v; 
    LET n = MOD(n, m); 
    IF (n = 0) THEN LET n = m; END IF; 
    RETURN n; 
END FUNCTION; 

С помощью этой функции доступны, и «операционный» стол t, содержащий значения даты/времени, записанные в формате UTC:

CREATE TABLE t (dt DATETIME YEAR TO FRACTION(3)); 

и отдельную таблицу ref_date, содержащая один столбец ref_date для опорного времени, и одна строки, содержащая, например, текущая дата:

CREATE TABLE ref_date (ref_date DATE NOT NULL UNIQUE); 
INSERT INTO ref_date VALUES(TODAY); 

, то вы можете запустить запрос, как это, чтобы выбрать соответствующие строки в США/Центральное время (UTC-06: 00 на данный момент):

SELECT dt_utc, 
     dt_central, 
     rd.ref_date - jmod(WEEKDAY(rd.ref_date), 7) - 7  AS two_sunday_ago, 
     rd.ref_date - jmod(WEEKDAY(rd.ref_date), 7)   AS one_sunday_ago 
    FROM (SELECT dt AS dt_utc, dt - INTERVAL(6:00) HOUR TO MINUTE AS dt_central FROM t) AS mapped_time 
    JOIN ref_date AS rd ON 1 = 1 
WHERE dt_central >= (rd.ref_date - jmod(WEEKDAY(rd.ref_date), 7) - 7) 
    AND dt_central < (rd.ref_date - jmod(WEEKDAY(rd.ref_date), 7)) 
ORDER BY dt_central 
; 

Это создает декартово произведение двух таблиц с ON 1 = 1 состояние. В Informix 12.10, вы можете использовать CROSS JOIN вместо:

SELECT dt_utc, 
     dt_central, 
     rd.ref_date - jmod(WEEKDAY(rd.ref_date), 7) - 7  AS two_sunday_ago, 
     rd.ref_date - jmod(WEEKDAY(rd.ref_date), 7)   AS one_sunday_ago 
    FROM (SELECT dt AS dt_utc, dt - INTERVAL(6:00) HOUR TO MINUTE AS dt_central FROM t) AS mapped_time 
CROSS JOIN ref_date AS rd 
WHERE dt_central >= (rd.ref_date - jmod(WEEKDAY(rd.ref_date), 7) - 7) 
    AND dt_central < (rd.ref_date - jmod(WEEKDAY(rd.ref_date), 7)) 
ORDER BY dt_central 
; 

Я не уверен, когда CROSS JOIN был добавлен - попробуйте; это, вероятно, сработает для вас.

Учитывая некоторую частично случайная, частично систематическую дату, как:

2016-11-01 06:07:02.029 
2016-11-01 11:19:47.027 
2016-11-01 14:08:31.677 
2016-11-01 16:40:23.650 
2016-11-01 17:47:37.206 
2016-11-01 17:55:31.371 
2016-11-02 10:42:05.401 
2016-11-02 10:48:21.017 
2016-11-02 18:27:41.661 
2016-11-02 23:09:18.752 
2016-11-02 23:50:20.358 
2016-11-03 03:36:08.826 
2016-11-03 06:07:01.217 
2016-11-03 14:19:57.977 
2016-11-03 16:03:01.813 
2016-11-04 00:24:43.164 
2016-11-04 00:58:09.912 
2016-11-04 07:37:17.457 
2016-11-04 07:52:10.984 
2016-11-04 11:36:59.265 
2016-11-04 16:44:17.827 
2016-11-05 13:35:50.577 
2016-11-05 15:12:14.804 
2016-11-05 15:30:10.579 
2016-11-05 15:45:05.364 
2016-11-05 19:15:30.116 
2016-11-05 22:25:58.315 
2016-11-06 05:25:46.535 
2016-11-06 05:32:00.865 
2016-11-06 10:35:07.787 
2016-11-06 20:28:40.664 
2016-11-06 20:57:01.862 
2016-11-07 01:31:02.657 
2016-11-07 03:17:15.625 
2016-11-07 06:54:13.873 
2016-11-07 07:19:33.032 
2016-11-07 09:12:31.531 
2016-11-07 12:53:07.034 
2016-11-07 17:14:34.281 
2016-11-08 03:53:15.886 
2016-11-08 06:20:39.009 
2016-11-08 10:30:20.182 
2016-11-08 14:25:14.173 
2016-11-08 16:34:39.781 
2016-11-08 17:59:40.327 
2016-11-09 01:45:40.142 
2016-11-09 06:12:05.475 
2016-11-09 18:10:02.483 
2016-11-09 18:29:01.374 
2016-11-10 03:15:42.938 
2016-11-10 14:56:39.354 
2016-11-10 15:19:28.320 
2016-11-10 17:05:13.327 
2016-11-10 19:21:54.386 
2016-11-10 21:46:10.826 
2016-11-11 05:36:52.942 
2016-11-11 08:35:54.840 
2016-11-11 12:38:57.564 
2016-11-11 18:05:08.286 
2016-11-11 18:11:33.612 
2016-11-11 23:22:55.222 
2016-11-12 01:40:20.976 
2016-11-12 07:42:37.907 
2016-11-12 12:12:51.797 
2016-11-12 12:34:56.000 
2016-11-12 23:11:16.077 
2016-11-13 02:37:34.081 
2016-11-13 05:35:05.835 
2016-11-13 05:54:12.853 
2016-11-13 07:31:33.380 
2016-11-13 11:34:56.000 
2016-11-13 15:31:13.543 
2016-11-13 20:20:31.259 
2016-11-13 21:52:01.573 
2016-11-14 02:00:39.716 
2016-11-14 02:42:48.699 
2016-11-14 04:31:23.312 
2016-11-14 09:24:15.559 
2016-11-14 10:34:56.000 
2016-11-14 12:45:36.275 
2016-11-14 22:55:42.745 
2016-11-15 01:47:49.193 
2016-11-15 13:31:26.524 
2016-11-15 15:30:24.267 
2016-11-15 19:07:17.032 
2016-11-15 19:09:01.029 
2016-11-15 19:34:56.000 
2016-11-15 20:14:28.359 
2016-11-16 00:01:43.336 
2016-11-16 08:53:21.018 
2016-11-16 09:06:47.542 
2016-11-16 18:34:56.000 
2016-11-16 19:45:41.016 
2016-11-16 21:57:11.321 
2016-11-16 23:18:24.716 
2016-11-17 03:33:05.719 
2016-11-17 07:01:09.417 
2016-11-17 08:08:16.121 
2016-11-17 09:41:19.698 
2016-11-17 10:42:33.239 
2016-11-17 12:15:27.553 
2016-11-17 17:34:56.000 
2016-11-17 21:53:55.909 
2016-11-18 04:24:15.725 
2016-11-18 04:46:03.008 
2016-11-18 05:55:30.590 
2016-11-18 12:14:24.298 
2016-11-18 12:58:37.578 
2016-11-18 15:49:14.780 
2016-11-18 16:34:56.000 
2016-11-19 05:02:52.783 
2016-11-19 07:30:51.461 
2016-11-19 09:56:43.041 
2016-11-19 15:34:56.000 
2016-11-19 18:16:47.583 
2016-11-19 18:50:38.236 
2016-11-20 02:38:04.760 
2016-11-20 03:36:04.681 
2016-11-20 05:59:59.999 
2016-11-20 06:00:00.000 
2016-11-20 09:14:10.393 
2016-11-20 09:43:03.942 
2016-11-20 11:49:54.133 
2016-11-20 14:34:56.000 
2016-11-20 16:26:38.713 
2016-11-21 03:35:07.572 
2016-11-21 13:34:56.000 
2016-11-21 20:37:13.670 
2016-11-21 21:50:15.654 
2016-11-21 23:45:38.274 
2016-11-22 05:39:06.759 
2016-11-22 07:41:51.497 
2016-11-22 09:15:53.879 
2016-11-22 12:34:56.000 
2016-11-22 15:23:12.384 
2016-11-22 20:22:38.939 
2016-11-22 21:50:18.608 
2016-11-22 22:44:44.659 
2016-11-23 03:35:36.576 
2016-11-23 10:25:07.755 
2016-11-23 11:34:56.000 
2016-11-23 13:18:18.491 
2016-11-23 18:06:22.202 
2016-11-24 01:15:31.356 
2016-11-24 02:28:40.031 
2016-11-24 10:34:56.000 
2016-11-24 12:17:26.300 
2016-11-24 15:39:32.904 
2016-11-24 16:50:10.130 
2016-11-24 22:41:28.450 
2016-11-24 22:58:19.290 
2016-11-25 01:43:38.514 
2016-11-25 05:55:49.725 
2016-11-25 19:34:56.000 
2016-11-25 21:23:51.303 
2016-11-25 23:15:01.760 
2016-11-26 01:30:18.578 
2016-11-26 09:04:10.808 
2016-11-26 09:40:47.942 
2016-11-26 14:51:15.283 
2016-11-26 17:45:58.383 
2016-11-26 18:34:56.000 
2016-11-27 00:00:00.000 
2016-11-27 05:59:59.999 
2016-11-27 06:00:00.000 
2016-11-27 07:34:30.816 
2016-11-27 08:38:15.413 
2016-11-27 16:05:01.385 
2016-11-27 17:34:56.000 
2016-11-28 00:42:58.846 
2016-11-28 05:12:39.664 
2016-11-28 09:38:25.615 
2016-11-28 12:47:44.086 
2016-11-28 15:32:46.675 
2016-11-28 16:34:56.000 
2016-11-28 20:02:04.530 
2016-11-28 20:06:25.688 
2016-11-29 07:37:28.761 
2016-11-29 14:29:18.228 
2016-11-29 15:34:56.000 
2016-11-29 17:54:28.873 
2016-11-29 17:54:36.695 
2016-11-29 20:31:31.838 
2016-11-30 04:27:36.828 
2016-11-30 09:08:41.064 
2016-11-30 11:30:09.853 
2016-11-30 12:40:14.306 
2016-11-30 14:34:56.000 
2016-11-30 18:55:15.446 
2016-11-30 19:53:16.446 
2016-11-30 19:53:56.432 

и установки опорной даты как 2016-11-28, выход запроса:

dt_utc|dt_central|two_sunday_ago|one_sunday_ago 
DATETIME YEAR TO FRACTION(3)|DATETIME YEAR TO FRACTION(3)|DATE|DATE 
2016-11-20 06:00:00.000|2016-11-20 00:00:00.000|2016-11-20|2016-11-27 
2016-11-20 09:14:10.393|2016-11-20 03:14:10.393|2016-11-20|2016-11-27 
2016-11-20 09:43:03.942|2016-11-20 03:43:03.942|2016-11-20|2016-11-27 
2016-11-20 11:49:54.133|2016-11-20 05:49:54.133|2016-11-20|2016-11-27 
2016-11-20 14:34:56.000|2016-11-20 08:34:56.000|2016-11-20|2016-11-27 
2016-11-20 16:26:38.713|2016-11-20 10:26:38.713|2016-11-20|2016-11-27 
2016-11-21 03:35:07.572|2016-11-20 21:35:07.572|2016-11-20|2016-11-27 
2016-11-21 13:34:56.000|2016-11-21 07:34:56.000|2016-11-20|2016-11-27 
2016-11-21 20:37:13.670|2016-11-21 14:37:13.670|2016-11-20|2016-11-27 
2016-11-21 21:50:15.654|2016-11-21 15:50:15.654|2016-11-20|2016-11-27 
2016-11-21 23:45:38.274|2016-11-21 17:45:38.274|2016-11-20|2016-11-27 
2016-11-22 05:39:06.759|2016-11-21 23:39:06.759|2016-11-20|2016-11-27 
2016-11-22 07:41:51.497|2016-11-22 01:41:51.497|2016-11-20|2016-11-27 
2016-11-22 09:15:53.879|2016-11-22 03:15:53.879|2016-11-20|2016-11-27 
2016-11-22 12:34:56.000|2016-11-22 06:34:56.000|2016-11-20|2016-11-27 
2016-11-22 15:23:12.384|2016-11-22 09:23:12.384|2016-11-20|2016-11-27 
2016-11-22 20:22:38.939|2016-11-22 14:22:38.939|2016-11-20|2016-11-27 
2016-11-22 21:50:18.608|2016-11-22 15:50:18.608|2016-11-20|2016-11-27 
2016-11-22 22:44:44.659|2016-11-22 16:44:44.659|2016-11-20|2016-11-27 
2016-11-23 03:35:36.576|2016-11-22 21:35:36.576|2016-11-20|2016-11-27 
2016-11-23 10:25:07.755|2016-11-23 04:25:07.755|2016-11-20|2016-11-27 
2016-11-23 11:34:56.000|2016-11-23 05:34:56.000|2016-11-20|2016-11-27 
2016-11-23 13:18:18.491|2016-11-23 07:18:18.491|2016-11-20|2016-11-27 
2016-11-23 18:06:22.202|2016-11-23 12:06:22.202|2016-11-20|2016-11-27 
2016-11-24 01:15:31.356|2016-11-23 19:15:31.356|2016-11-20|2016-11-27 
2016-11-24 02:28:40.031|2016-11-23 20:28:40.031|2016-11-20|2016-11-27 
2016-11-24 10:34:56.000|2016-11-24 04:34:56.000|2016-11-20|2016-11-27 
2016-11-24 12:17:26.300|2016-11-24 06:17:26.300|2016-11-20|2016-11-27 
2016-11-24 15:39:32.904|2016-11-24 09:39:32.904|2016-11-20|2016-11-27 
2016-11-24 16:50:10.130|2016-11-24 10:50:10.130|2016-11-20|2016-11-27 
2016-11-24 22:41:28.450|2016-11-24 16:41:28.450|2016-11-20|2016-11-27 
2016-11-24 22:58:19.290|2016-11-24 16:58:19.290|2016-11-20|2016-11-27 
2016-11-25 01:43:38.514|2016-11-24 19:43:38.514|2016-11-20|2016-11-27 
2016-11-25 05:55:49.725|2016-11-24 23:55:49.725|2016-11-20|2016-11-27 
2016-11-25 19:34:56.000|2016-11-25 13:34:56.000|2016-11-20|2016-11-27 
2016-11-25 21:23:51.303|2016-11-25 15:23:51.303|2016-11-20|2016-11-27 
2016-11-25 23:15:01.760|2016-11-25 17:15:01.760|2016-11-20|2016-11-27 
2016-11-26 01:30:18.578|2016-11-25 19:30:18.578|2016-11-20|2016-11-27 
2016-11-26 09:04:10.808|2016-11-26 03:04:10.808|2016-11-20|2016-11-27 
2016-11-26 09:40:47.942|2016-11-26 03:40:47.942|2016-11-20|2016-11-27 
2016-11-26 14:51:15.283|2016-11-26 08:51:15.283|2016-11-20|2016-11-27 
2016-11-26 17:45:58.383|2016-11-26 11:45:58.383|2016-11-20|2016-11-27 
2016-11-26 18:34:56.000|2016-11-26 12:34:56.000|2016-11-20|2016-11-27 
2016-11-27 00:00:00.000|2016-11-26 18:00:00.000|2016-11-20|2016-11-27 
2016-11-27 05:59:59.999|2016-11-26 23:59:59.999|2016-11-20|2016-11-27 

Вы можете увидеть точные отрезки данных; времена 05:59:59.999 и 06:00:00.000 отображаются в правильных местах (и эти строки не присутствуют случайным образом).

Учитывая эталонную дату 2016-11-27, выход:

dt_utc|dt_central|two_sunday_ago|one_sunday_ago 
DATETIME YEAR TO FRACTION(3)|DATETIME YEAR TO FRACTION(3)|DATE|DATE 
2016-11-13 07:31:33.380|2016-11-13 01:31:33.380|2016-11-13|2016-11-20 
2016-11-13 11:34:56.000|2016-11-13 05:34:56.000|2016-11-13|2016-11-20 
2016-11-13 15:31:13.543|2016-11-13 09:31:13.543|2016-11-13|2016-11-20 
2016-11-13 20:20:31.259|2016-11-13 14:20:31.259|2016-11-13|2016-11-20 
2016-11-13 21:52:01.573|2016-11-13 15:52:01.573|2016-11-13|2016-11-20 
2016-11-14 02:00:39.716|2016-11-13 20:00:39.716|2016-11-13|2016-11-20 
2016-11-14 02:42:48.699|2016-11-13 20:42:48.699|2016-11-13|2016-11-20 
2016-11-14 04:31:23.312|2016-11-13 22:31:23.312|2016-11-13|2016-11-20 
2016-11-14 09:24:15.559|2016-11-14 03:24:15.559|2016-11-13|2016-11-20 
2016-11-14 10:34:56.000|2016-11-14 04:34:56.000|2016-11-13|2016-11-20 
2016-11-14 12:45:36.275|2016-11-14 06:45:36.275|2016-11-13|2016-11-20 
2016-11-14 22:55:42.745|2016-11-14 16:55:42.745|2016-11-13|2016-11-20 
2016-11-15 01:47:49.193|2016-11-14 19:47:49.193|2016-11-13|2016-11-20 
2016-11-15 13:31:26.524|2016-11-15 07:31:26.524|2016-11-13|2016-11-20 
2016-11-15 15:30:24.267|2016-11-15 09:30:24.267|2016-11-13|2016-11-20 
2016-11-15 19:07:17.032|2016-11-15 13:07:17.032|2016-11-13|2016-11-20 
2016-11-15 19:09:01.029|2016-11-15 13:09:01.029|2016-11-13|2016-11-20 
2016-11-15 19:34:56.000|2016-11-15 13:34:56.000|2016-11-13|2016-11-20 
2016-11-15 20:14:28.359|2016-11-15 14:14:28.359|2016-11-13|2016-11-20 
2016-11-16 00:01:43.336|2016-11-15 18:01:43.336|2016-11-13|2016-11-20 
2016-11-16 08:53:21.018|2016-11-16 02:53:21.018|2016-11-13|2016-11-20 
2016-11-16 09:06:47.542|2016-11-16 03:06:47.542|2016-11-13|2016-11-20 
2016-11-16 18:34:56.000|2016-11-16 12:34:56.000|2016-11-13|2016-11-20 
2016-11-16 19:45:41.016|2016-11-16 13:45:41.016|2016-11-13|2016-11-20 
2016-11-16 21:57:11.321|2016-11-16 15:57:11.321|2016-11-13|2016-11-20 
2016-11-16 23:18:24.716|2016-11-16 17:18:24.716|2016-11-13|2016-11-20 
2016-11-17 03:33:05.719|2016-11-16 21:33:05.719|2016-11-13|2016-11-20 
2016-11-17 07:01:09.417|2016-11-17 01:01:09.417|2016-11-13|2016-11-20 
2016-11-17 08:08:16.121|2016-11-17 02:08:16.121|2016-11-13|2016-11-20 
2016-11-17 09:41:19.698|2016-11-17 03:41:19.698|2016-11-13|2016-11-20 
2016-11-17 10:42:33.239|2016-11-17 04:42:33.239|2016-11-13|2016-11-20 
2016-11-17 12:15:27.553|2016-11-17 06:15:27.553|2016-11-13|2016-11-20 
2016-11-17 17:34:56.000|2016-11-17 11:34:56.000|2016-11-13|2016-11-20 
2016-11-17 21:53:55.909|2016-11-17 15:53:55.909|2016-11-13|2016-11-20 
2016-11-18 04:24:15.725|2016-11-17 22:24:15.725|2016-11-13|2016-11-20 
2016-11-18 04:46:03.008|2016-11-17 22:46:03.008|2016-11-13|2016-11-20 
2016-11-18 05:55:30.590|2016-11-17 23:55:30.590|2016-11-13|2016-11-20 
2016-11-18 12:14:24.298|2016-11-18 06:14:24.298|2016-11-13|2016-11-20 
2016-11-18 12:58:37.578|2016-11-18 06:58:37.578|2016-11-13|2016-11-20 
2016-11-18 15:49:14.780|2016-11-18 09:49:14.780|2016-11-13|2016-11-20 
2016-11-18 16:34:56.000|2016-11-18 10:34:56.000|2016-11-13|2016-11-20 
2016-11-19 05:02:52.783|2016-11-18 23:02:52.783|2016-11-13|2016-11-20 
2016-11-19 07:30:51.461|2016-11-19 01:30:51.461|2016-11-13|2016-11-20 
2016-11-19 09:56:43.041|2016-11-19 03:56:43.041|2016-11-13|2016-11-20 
2016-11-19 15:34:56.000|2016-11-19 09:34:56.000|2016-11-13|2016-11-20 
2016-11-19 18:16:47.583|2016-11-19 12:16:47.583|2016-11-13|2016-11-20 
2016-11-19 18:50:38.236|2016-11-19 12:50:38.236|2016-11-13|2016-11-20 
2016-11-20 02:38:04.760|2016-11-19 20:38:04.760|2016-11-13|2016-11-20 
2016-11-20 03:36:04.681|2016-11-19 21:36:04.681|2016-11-13|2016-11-20 
2016-11-20 05:59:59.999|2016-11-19 23:59:59.999|2016-11-13|2016-11-20 
+0

Спасибо за помощь с этим Джонатаном. К сожалению, я не думаю, что мы можем прикоснуться к БД, это для call-центра Cisco и не хочу с ним связываться. Я попытаюсь обобщить значения после выполнения запроса. Я многому научился читать ваш скрипт, но мы можем попробовать что-то похожее на него, не создавая новую таблицу. Еще раз спасибо! – esafresa

+0

Таблица 'ref_date' может быть временной таблицей, а не постоянной. Вы также можете написать бегущую хранимую процедуру, которая передает контрольную дату и возвращает правильные данные. Есть бесконечные способы обработки этого материала. Ключевыми элементами являются: (1) подзапрос для создания центральных штампов времени; (2) 'jmod' функция (имя полностью по вашему выбору), чтобы правильно рассчитать смещения даты. Если функция считается проблемой, вы можете, скорее всего, написать выражение case: 'CASE MOD (i, j) КОГДА 0 THEN j ELSE MOD (i, j) END', но это не так элегантно и делает код более сложным понимать. –