带有 Where 子句的 SQL 助手

SQL Assistant with Where Clause

提问人:shadow 提问时间:10/31/2023 最后编辑:shadow 更新时间:10/31/2023 访问量:31

问:

我正在使用SQLite。以下是我在SQLite中使用的一些列的代码和Excel屏幕截图。我正在尝试创建一个 where 子句,该子句将选择在 vax 开始时间列中指定时间之前发生的注册 at 列中的时间。下载数据时,它在寄存器列中同时具有日期和时间。我正在尝试选择时间部分以与 vax 开始时间列中的时间进行比较。我正在尝试选择 excel 工作表屏幕截图中所示的时间部分,以便我可以创建一个 where 子句,该子句将在结果中显示在 vax 开始时间之前注册的人,并将他们指示为预先注册。我尝试使用 like 和通配符 _ 和 %,但是我得到了错误或错误的结果。关于如何在 vax 开始时间之前的寄存器列中选择时间的任何建议?



SELECT * 
FROM COREGAMasterDatabasePowerBI AS A 

JOIN COREGAScheduling15 AS B 

ON soundex(A.Location) LIKE soundex(B.Site_Name) AND A.Visit_time=B.Date 

ORDER BY B.date ASC
sqlite where-子句

评论


答:

0赞 MikeT 10/31/2023 #1

为了简化问题,在SQLite中存储数据时,应使用可识别的日期/时间格式。例如 YYYY-MM-DD hh:mm:ss

  • 有人怀疑已经假设SQLite在处理日期方面与MS Excel一样全面。SQLite不是。除非使用日期/时间函数(下面的链接),否则日期很简单,在排序或比较时是二进制字节流。
  • 尽管可能的其他解决方案需要操作数据,但日期和月份可以是 1 个或 2 个字符,因此很复杂。每列至少需要一次操作。

查看 https://www.sqlite.org/lang_datefunc.html

  • 否则,您可能会遇到问题,例如 如果使用 2023 年 9 月 12 日等格式,将根据月、日、年进行排序,此外,2023 年 11 月 12 日将在 2023 年 9 月 12 日之前考虑(即 10 的 1 小于 9)。ORDER BY B.date ASC

使用公认的、重要的可排序/可比较的日期格式,那么它相对简单,因为您可以使用类似的东西:-

SELECT * 
FROM COREGAMasterDatabasePowerBI AS A 
JOIN COREGAScheduling15 AS B 
ON soundex(A.Location) = soundex(B.Site_Name) AND a.visit_time < b.date
ORDER BY B.date ASC

演示(使用SQLite工具(Navicat)):-

/* Just-in-case Cleanup */
DROP TABLE IF EXISTS COREGAMasterDatabasePowerBI;
DROP TABLE IF EXISTS COREGAScheduling15;
/* Create the tables */
CREATE TABLE IF NOT EXISTS COREGAMasterDatabasePowerBI (location TEXT, visit_time TEXT);
CREATE TABLE IF NOT EXISTS COREGAScheduling15 (site_name TEXT, date TEXT);
/* Load both tables with some data */
INSERT INTO COREGAScheduling15 VALUES 
    ('A','2023-09-12 12:45:00')
    ,('B','2023-09-12 11:45:00')
    ,('C','2023-09-12 10:45:00')
;
INSERT INTO COREGAMasterDatabasePowerBI VALUES
    ('A','2023-09-12 12:43:00')
    ,('A','2023-09-12 12:42:00')
    ,('A','2023-09-12 12:48:00') /* after */
    ,('B','2023-09-12 11:48:00') /* exact same time as registration */
    ,('B','2023-09-11 11:48:00')
    ,('B','2023-09-12 11:47:00')
    ,('B','2023-08-12 11:48:00')
;
/* Demo output 1 - Original just changed slightly */
SELECT * 
FROM COREGAMasterDatabasePowerBI AS A 
JOIN COREGAScheduling15 AS B 
ON soundex(A.Location) = soundex(B.Site_Name) AND a.visit_time < b.date
-- WHERE a.visit_time < b.date
ORDER BY B.date ASC
;
/* Demo output 2 - Original but WHERE clause as opposed to JOIN expression */
SELECT * 
FROM COREGAMasterDatabasePowerBI AS A 
JOIN COREGAScheduling15 AS B 
ON soundex(A.Location) = soundex(B.Site_Name)
WHERE a.visit_time < b.date
ORDER BY B.date ASC
;
/* Demo Output 3 - Show both sorts (PREG or AT OR POSTREG) */
SELECT 'PREREG',* 
FROM COREGAMasterDatabasePowerBI AS A 
JOIN COREGAScheduling15 AS B 
ON soundex(A.Location) = soundex(B.Site_Name) AND a.visit_time < b.date
-- WHERE a.visit_time < b.date
UNION ALL SELECT 'AT OR POSTREG',*
FROM COREGAMasterDatabasePowerBI AS A 
JOIN COREGAScheduling15 AS B 
ON soundex(A.Location) = soundex(B.Site_Name) AND a.visit_time >= b.date
ORDER BY B.date ASC
;
/* Cleanup demo environment */
DROP TABLE IF EXISTS COREGAMasterDatabasePowerBI;
DROP TABLE IF EXISTS COREGAScheduling15;

结果输出 (SELECTS):-

演示 1

enter image description here

演示 2(即与演示 1 的数据相同)

enter image description here

演示 3

enter image description here