sql语句怎么把yyyy- MM-dd HH:mm:ss 改为日期数据
在SQL中,将包含时间戳的字符串格式yyyy-MM-dd HH:mm:ss
转换为日期类型,通常需要使用特定函数来解析这种格式。这取决于你使用的数据库管理系统(DBMS),因为每个系统可能会有不同的日期函数。
例如,在MySQL中,你可以使用STR_TO_DATE()
函数:
SELECT STR_TO_DATE('2023-04-01 15:30:00', '%Y-%m-%d %H:%i:%s') AS converted_date;
在SQL Server中,可以使用CONVERT()
或DATEFROMPARTS()
函数:
SELECT DATEFROMPARTS(2023, 4, 1, 15, 30, 0) AS converted_date; -- 使用DATEFROMPARTS
在PostgreSQL中,则可以使用TO_DATE()
函数:
SELECT TO_DATE('2023-04-01 15:30:00', 'YYYY-MM-DD HH24:MI:SS') AS converted_date;
记得替换实际的时间戳值。如果你有大量数据需要转换,建议使用UPDATE语句批量处理。
这条sql有问题吗? SELECT * FROM IDC_WORK_CHECK WHERE TO_DATE(CHECK_TIME, 'yyyy-MM-dd HH24:mi:ss') >= TO_DATE('2023-06-28', 'yyyy-MM-dd HH24:mi:ss') AND TO_DATE(CHECK_TIME, 'yyyy-MM-dd HH24:mi:ss') <= TO_DATE('2023-06-28', 'yyyy-MM-dd HH24:mi:ss')
这条SQL查询语句存在一些问题。虽然你尝试使用TO_DATE函数将CHECK_TIME字段和日期字符串转换为日期类型,但在这种情况下,转换是不必要的。你可以直接将日期字符串与CHECK_TIME字段进行比较。修改后的查询如下所示:
SELECT * FROM IDC_WORK_CHECK WHERE CHECK_TIME >= TO_DATE('2023-06-28', 'yyyy-MM-dd HH24:mi:ss') AND CHECK_TIME <= TO_DATE('2023-06-28', 'yyyy-MM-dd HH24:mi:ss')
这样修改后,查询将会选择在2023年6月28日之间的所有记录。
-- 建表语句 CREATE TABLE T202303( USERID INT, CHECKIN DATE ); INSERT INTO T202303 (USERID, CHECKIN) VALUES (2, TO_DATE ('2018-12-01 18:02:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (1, TO_DATE ('2018-12-01 08:25:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (1, TO_DATE ('2018-12-01 08:26:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (1, TO_DATE ('2018-12-01 17:02:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (1, TO_DATE ('2018-12-02 08:27:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (2, TO_DATE ('2018-12-01 08:26:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (2, TO_DATE ('2018-12-01 17:03:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (2, TO_DATE ('2018-12-01 17:29:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (2, TO_DATE ('2018-12-01 18:01:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (1, TO_DATE ('2018-12-01 16:20:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (2, TO_DATE ('2018-12-01 16:02:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303 (USERID, CHECKIN) VALUES (2, TO_DATE ('2018-12-01 16:32:00', 'YYYY-MM-DD HH24:MI:SS')); INSERT INTO T202303(USERID, CHECKIN) VALUES (1,TO_DATE('2018-12-01 09:00:00','YYYY-MM-DD HH24:MI:SS')); COMMIT; 需求: 每天上午8:00-9:00,下午16:30-18:00这两个时间段内的最早的一条记录视为“有效”,在这两个时间段内其它打卡数据显示“重复”,否则视为“无效” 预计实现效果如下:
可以使用以下 SQL 语句来实现该需求:
SELECT USERID,
CASE
WHEN TO_CHAR(CHECKIN, 'HH24') BETWEEN '08' AND '09'
OR TO_CHAR(CHECKIN, 'HH24') BETWEEN '16' AND '17' AND TO_CHAR(CHECKIN, 'MI') >= '30'
THEN
CASE
WHEN CHECKIN = (SELECT MIN(CHECKIN)
FROM T202303 t2
WHERE t1.USERID = t2.USERID
AND TO_CHAR(t2.CHECKIN, 'YYYY-MM-DD') = TO_CHAR(t1.CHECKIN, 'YYYY-MM-DD')
AND TO_CHAR(t2.CHECKIN, 'HH24') BETWEEN '08' AND '09'
OR TO_CHAR(t2.CHECKIN, 'HH24') BETWEEN '16' AND '17'
AND TO_CHAR(t2.CHECKIN, 'MI') >= '30')
THEN '有效'
ELSE '重复'
END
ELSE '无效'
END AS STATUS,
CHECKIN
FROM T202303 t1
ORDER BY USERID, CHECKIN;
该 SQL 语句中,首先判断 CHECKIN 是否在指定的时间段内,如果是,则使用子查询找到该用户在同一天内的最早打卡记录,如果该记录与当前记录相同,则视为“有效”,否则视为“重复”;如果不在指定的时间段内,则视为“无效”。其中,TO_CHAR 函数用于将日期时间转换为字符串,从而方便比较时间。
相关推荐















