【问题标题】:Cast datetime in the where clause of the query在查询的 where 子句中转换日期时间
【发布时间】:2015-07-13 12:06:47
【问题描述】:
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. 它给出了一个错误。

我需要什么:

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

请给我建议。谢谢

【问题讨论】:

  • 您收到的错误是什么?
  • "它给出了一个错误。"如果您收到错误消息,请始终添加。 “它给出了一个错误”,因为唯一的声明是绝对没用的。
  • 对不起,我理解我的弱点。我正在尝试取回该错误消息。我会发布它。感谢您指出我的错误。
  • 你的日期表达式应该没问题。除非您有相当晦涩的国际化设置,否则 SQL Server 可以理解日期的 YYYY-MM-DD 格式。您的查询可能会从根本上简化,但您没有提供示例数据、所需结果以及您想要做什么的清晰说明。
  • @GordonLinoff,我理解我的问题中的错误。我会改进的。谢谢。

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


【解决方案1】:

您的 WHERE 子句太混乱了,我完全不明白,我会尽可能使用 BETWEEN。

我敢打赌您会遇到截断错误,因为您正在尝试将日期时间数据类型转换为 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)
    )

【讨论】:

    【解决方案2】:

    这对于评论来说太长了,并且不能直接解决字符串的任何格式问题。你的日期比较很复杂。如果StartTimeEndTime 有时间组件,并且您想知道是否涵盖了“2015-07-13”的整个天,则使用:

    WHERE StartTime <= '2015-07-13' and EndTime >= '2015-07-14'
    

    也就是说,周期在一天开始之前开始,在一天开始之后结束。

    如果您想知道日期的任何部分是否包括在内:

    WHERE StartTime < '2015-07-14' and EndTime >= '2015-07-13'
    

    即周期在一天结束之前开始,在一天开始之后开始。

    如果您不喜欢逻辑中的“2015-07-14”,请使用DATEADD(day, 1, '2015-07-13')

    而且,如果你想独立于国际化设置,你也可以使用CAST('20150714' as DATE)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2014-11-11
      • 1970-01-01
      相关资源
      最近更新 更多