sqlite 带Where子句的SQL助手

9lowa7mx  于 2023-11-21  发布在  SQLite
关注(0)|答案(1)|浏览(134)

我正在使用SQLite。下面是我的代码和Excel屏幕截图的一些列,我正在使用从SQLite。我试图创建一个where子句,将选择的时间,在注册在列中发生的时间之前,在vax开始时间列中的指示时间。当数据下载它有日期和时间在注册在列。我试图选择的时间部分,以比较的时间在vax开始时间列。我试图选择Excel工作表屏幕截图中显示的时间部分,以便我可以制作一个where子句,该子句将在结果中显示在vax开始时间之前注册的人,并将他们指示为预注册。我试图使用like和numer_and %,但是我得到了一个错误或错误的结果。关于如何在寄存器中选择在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

字符串

vddsk6oq

vddsk6oq1#

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

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

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

  • 否则,您可能会遇到问题,例如,如果使用9/12/2023这样的格式,ORDER BY B.date ASC将根据月份然后是日期然后是年份进行排序,并且2023年11月12日将在2023年9月12日之前考虑(即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

字符串

Demo(使用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

x1c 0d1x的数据

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


演示3


相关问题