Foxpro Между пунктом - PullRequest
       14

Foxpro Между пунктом

0 голосов
/ 27 ноября 2018

В настоящее время я смотрю на запросы foxpro, иначе говоря, если SQL пьян, и мне нужна помощь, чтобы понять, как что-то работает, поскольку я совершенно новичок в foxpro.

SELECT keyfld, SUBSTR(CCB_SERIAL,11,2) AS a ;
FROM g:\mirror\DBFS\CCB ;
WHERE 
(BETWEEN({^2018-01-01},pl_st_dt, pl_end_dt) or 
BETWEEN({^2018-03-31},pl_st_dt,pl_end_dt)) 

Мое понимание того, как интерпретировать дно 2Строки:

where
     pl_st_dt >= '2018-01-01' OR
     pl_end_dt >= '2018-01-01' OR
     pl_st_dt <= '2018-03-31' OR
     pl_end_dt <= '2018-03-31'

Это правильно?

Я пытаюсь взять запрос foxpro и написать эквивалентную версию t-sql.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Если вы не говорите с SQL Server, будет быстрее использовать явный формат даты FoxPro, а не строку.То есть {^ 2018-01-01}, а не «2018-01-01».

Также менее подвержен ошибкам, поскольку строка может интерпретироваться по-разному, в зависимости от настроек даты FoxPro.

Еще одна вещь, которую нужно иметь в виду, состоит в том, что таблицы FoxPro имеют типы данных Date и Datetime.Дата является интегральной (что означает, что точные сравнения надежны), но IIRC, последняя имеет разрешение менее миллисекунды.И снова IIRC, сравнивая их, FoxPro просто усекает Datetime до Date, поэтому остерегайтесь неожиданных результатов.

0 голосов
/ 27 ноября 2018

Не совсем.

МЕЖДУ там эквивалентно:

({^2018-01-01} BETWEEN pl_st_dt and pl_end_dt) or 
({^2018-03-31} BETWEEN pl_st_dt and pl_end_dt)

Таким образом, ваша эквивалентность будет:

WHERE
  (pl_st_dt <= '2018-01-01' AND '2018-01-01' <= pl_end_dt)
  OR
  (pl_st_dt <= '2018-03-31' AND '2018-03-31' <= pl_end_dt)
...