Sql server Foxpro中间条款
我目前正在研究foxpro查询,也称为if-SQL-where-dunk,我需要帮助理解某些东西是如何工作的,因为我对foxpro完全陌生Sql server Foxpro中间条款,sql-server,tsql,foxpro,Sql Server,Tsql,Foxpro,我目前正在研究foxpro查询,也称为if-SQL-where-dunk,我需要帮助理解某些东西是如何工作的,因为我对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)) 我对如何解释最后
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))
我对如何解释最后两行的理解是
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'
在哪里
pl_st_dt>=“2018-01-01”或
pl_end_dt>=“2018-01-01”或
不太好
两者之间的差异相当于:
({^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)
在哪里
(p
两者之间的差异相当于:
({^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)
在哪里
(pl_st_dt如果您不是在与SQL Server交谈,使用FoxPro显式日期格式而不是字符串会更快。也就是说,{^2018-01-01}而不是“2018-01-01”
也不容易出错,因为根据FoxPro的日期设置,字符串可能以不同的方式解释
要记住的另一件事是FoxPro表同时具有日期和日期时间数据类型。日期是整数(意味着精确的比较是可靠的),但IIRC,后者的分辨率为亚毫秒。再次IIRC,在比较两者时,FoxPro只是将日期时间截断为日期,因此要小心意外结果。如果您不是在与SQL Server对话,使用FoxPro显式日期格式而不是字符串会更快。也就是说,{^2018-01-01}而不是“2018-01-01”
也不容易出错,因为根据FoxPro的日期设置,字符串可能以不同的方式解释
要记住的另一件事是FoxPro表同时具有日期和日期时间数据类型。日期是整数(意味着精确的比较是可靠的),但IIRC,后者的分辨率为亚毫秒。再次IIRC,在比较两者时,FoxPro只是将Datetime截断为一个日期,因此要小心意外结果。删除了sql server和tsql标记,因为这与sql server无关……你说这是FoxPro。编辑我的帖子,解释为什么我首先有这些标记。注意在原始查询中使用括号。所以不-你的tsql查询不一样。我建议原始查询可能在逻辑上有缺陷-但谁能在不理解此类查询的用途/目标的情况下说呢。删除了sql server和tsql标记,因为这与sql server无关…你说这是foxpro。编辑我的帖子来解释是的,我一开始就有这些标记。请注意原始查询中使用的括号。因此,不-您的tsql查询不一样。我建议原始查询可能存在逻辑缺陷-但谁能在不理解此类查询的用途/目标的情况下说呢。