在查询的where子句中转换datetime

时间:2015-07-13 12:06:48

标签: sql date datetime casting sql-server-2012

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) 

而不是StartTimeEndTime.它给出了错误。

我需要什么:

如何将StartTimeEndTime转换为where子句本身内的yyyy-mm-dd? (这两个字段都是日期时间类型)

请指教。感谢

2 个答案:

答案 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)

这对于评论来说太长了,并且没有直接解决字符串的任何格式问题。你的日期比较很复杂。如果StartTimeEndTime有时间组件,并且您想知道&#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)