Sql 如何将datetime转换为datetime2?

Sql 如何将datetime转换为datetime2?,sql,sql-server,datetime,Sql,Sql Server,Datetime,我对一个查询有一个问题,当前where子句中使用了不同表中的两个字段来过滤数据。由于一个是datetime,另一个是datetime2,我得到了 "Conversion failed when converting date and/or time from character string" error. 以下是查询: /*| 1) SELECT - ABSENCES AND SCHEDULES |*/ ------------------------------------------

我对一个查询有一个问题,当前where子句中使用了不同表中的两个字段来过滤数据。由于一个是datetime,另一个是datetime2,我得到了

"Conversion failed when converting date and/or time from character string" error.
以下是查询:

/*| 1) SELECT - ABSENCES AND SCHEDULES |*/
------------------------------------------
    -- Retrieve data of absences
DECLARE @SADate AS DATETIME2(7)
SET @SADate = '2012-12-02'

    -- Retrieve absences that have a supply teacher and are within the current date.
SELECT SAStaffID
       ,LastName + ', ' + FirstName AS FullName
       ,SADate
       ,SSPeriod
       ,SSCourseCode
       ,SSRoom
    FROM tblOCStaffAbsent -- Join the staff schedule of the absent teacher that has a supply.
    INNER JOIN tblOCStaffSchedule S
        ON tblOCStaffAbsent.SAStaffID = S.SSStaffID
           AND @SADate BETWEEN S.SSStartDt AND S.SSEndDt
    INNER JOIN tblStaff SF
        ON SF.StaffID = SAStaffID
    INNER JOIN tblUsers U
        ON U.UserID = SF.StaffUserID
    WHERE SASupplyID IS NOT NULL
        AND SADate = @SADate

--------------------------------
/*| 2) SELECT - SUPERVISIONS |*/
--------------------------------
    --Union the supervisions
UNION ALL
SELECT SSupStaffID
       ,SupervisionDt
       ,CASE WHEN SSupPeriodHalf IS NOT NULL THEN SSupPeriod + '-' + SSupPeriodHalf
             ELSE SSupPeriod
        END AS FullPeriod
       ,'(SP) ' + SSupLocation
       ,NULL AS SSupRoom
       ,SSupMIDent
    FROM tblOCStaffSupervisions
    WHERE SupervisionDt = @SADate

SADate是tblOCStaffAbsent中的datetime字段,SupervisionDt是tblOCStaffSupervisions中的datetime2字段。

来自tblOCStaffSupervisions表的SupervisionDt值可能是datetime数据类型。@SADate='2012-12-02'是一个字符串@SADate应该在DateTime数据类型中设置。

如果仔细查看错误消息,将
DateTime
DATETIME2
进行比较并不是问题,sql server可以毫无问题地完成这项操作

您将某些内容存储为字符串,但正在尝试将其转换为
DATETIME2

转换为
DATETIME2
的操作与其他转换一样
convert(DATETIME2,MyDatetimeField)

只需知道
DATETIME2
DATETIME
具有更高的精度。您的数据不会更改,只有以更高精度添加的新信息才会使用它

看看下面的例子。两行将产生相同的结果

DECLARE @Datetime DATETIME = '03/21/2014 15:23:34.444'

SELECT @Datetime
UNION ALL
SELECT CONVERT(DATETIME2, @Datetime)
但在以下情况下

DECLARE @datetime2 DATETIME2 = SYSDATETIME();

SELECT @datetime2
UNION ALL
SELECT CONVERT(DATETIME, @datetime2)

第一次选择将产生比第二次选择更高的精度点

将日期转换为字符串以进行比较?不能将@SADAte用作Datetime吗?SSStartDt和SSEndDt是什么数据类型?因为您只关心日期部分。我只想使用
DATE
SSStartDt和SSEndDt都是datetime是的。这篇帖子有点滑稽,因为他说“因为一个是datetime,另一个是datetime2”,错误明确地说:这涉及到一个字符串,伙计;)