SELECT *
FROM tblClassAppointments
INNER JOIN tblClassGroups ON tblClassAppointments.GroupID = tblClassGroups.GroupID
WHERE (
('2015-07-13' >= StartTime)
AND ('2015-07-13' <= EndTime)
AND ('2015-07-13' > StartTime)
AND ('2015-07-13' >= EndTime)
)
OR (
('2015-07-13' >= StartTime)
AND ('2015-07-13' < EndTime)
AND ('2015-07-13' > StartTime)
AND ('2015-07-13' <= EndTime)
)
OR (
('2015-07-13' <= StartTime)
AND ('2015-07-13' < EndTime)
AND ('2015-07-13' >= StartTime)
AND ('2015-07-13' <= EndTime)
)
OR (
('2015-07-13' <= StartTime)
AND ('2015-07-13' >= EndTime)
)
我使用上面的查询来获取放置一段时间的课程约会。我需要将StartTime(tblClassAppointments.StartTime)
和EndTime(tblClassAppointments.EndTime)
转换为yyyy-mm-dd
。
我尝试了什么:
我试过
CONVERT(char(10), StartTime, 126)
和
CONVERT(char(10), EndTime, 126)
而不是StartTime
和EndTime.
它给出了错误。
我需要什么:
如何将StartTime
和EndTime
转换为where子句本身内的yyyy-mm-dd
? (这两个字段都是日期时间类型)
请指教。感谢
答案 0 :(得分:1)
你的WHERE子句太混乱,我根本不理解,我会尽可能尝试使用BETWEEN。
我愿意打赌你收到截断错误,因为你试图将datetime数据类型转换为char(10)
,这太小了。如果你关心的只是日期部分,那么转换/转换为DATE数据类型。
以下是一种实现此目的的方法示例:
; with CTE1 as (
SELECT *
, cast(StartTime as date) as StartTime2
, cast(EndTime as date) as EndTime2
FROM tblClassAppointments
INNER JOIN tblClassGroups ON tblClassAppointments.GroupID = tblClassGroups.GroupID
)
select *
from CTE1
WHERE
('2015-07-13' between StartTime2 and EndTime2)
OR (
('2015-07-13' <= StartTime2)
AND ('2015-07-13' < EndTime2)
AND ('2015-07-13' >= StartTime2)
AND ('2015-07-13' <= EndTime2)
)
OR (
('2015-07-13' <= StartTime2)
AND ('2015-07-13' >= EndTime2)
)
答案 1 :(得分:0)
这对于评论来说太长了,并且没有直接解决字符串的任何格式问题。你的日期比较很复杂。如果StartTime
和EndTime
有时间组件,并且您想知道&#39; 2015-07-13&#39; 整个日。被覆盖,然后使用:
WHERE StartTime <= '2015-07-13' and EndTime >= '2015-07-14'
也就是说,期间在白天开始之前开始,在白天开始之后结束。
如果您想知道日期的任何部分是否包含在内:
WHERE StartTime < '2015-07-14' and EndTime >= '2015-07-13'
也就是说,期间在一天结束之前开始,并在一天开始之后开始。
如果你不喜欢&#39; 2015-07-14&#39;在逻辑中,然后使用DATEADD(day, 1, '2015-07-13')
。
而且,如果您想独立于国际化设置,您还可以使用CAST('20150714' as DATE)
。