带有Where子句的SQL Assistant

问题描述 投票:0回答:1

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

Columns



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-clause
1个回答
0
投票

首先为了简化问题,在 SQLite 中存储数据时应该使用公认的日期/时间格式。例如YYYY-MM-DD 时:分:秒

  • 有人怀疑 SQLite 在处理日期方面与 MS Excel 一样全面。 SQLite 不是。除非使用日期/时间函数(下面的链接),否则日期在排序或比较时只是简单的二进制字节流。

参见https://www.sqlite.org/lang_datefunc.html

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

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

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;

结果输出(选择):-

演示1

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

演示3

© www.soinside.com 2019 - 2024. All rights reserved.