简体   繁体   English

如何将datetime转换为datetime2?

[英]How to convert datetime to datetime2?

I am having an issue with a query currently where two fields in different tables are being used in a WHERE clause to filter data. 我现在有一个查询问题,其中在WHERE子句中使用不同表中的两个字段来过滤数据。 Due to one being datetime and the other being datetime2, I am getting the 由于一个是datetime,另一个是datetime2,我得到了

"Conversion failed when converting date and/or time from character string" error.

Here is the query: 这是查询:

/*| 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 is the datetime field within tblOCStaffAbsent and SupervisionDt is the datetime2 field within tblOCStaffSupervisions. SADate是tblOCStaffAbsent中的datetime字段,而SupervisionDt是tblOCStaffSupervisions中的datetime2字段。

The value for SupervisionDt which is coming from tblOCStaffSupervisions table may be of DateTime Datatype. 来自tblOCStaffSupervisions表的SupervisionDt值可以是DateTime数据类型。 The @SADate = '2012-12-02' is a string. @SADate ='2012-12-02'是一个字符串。 @SADate should be set in DateTime Datatype. @SADate应该在DateTime数据类型中设置。

If you look carefully at your error message, it is not problem of comparing DATETIME to DATETIME2 which can be done by sql server without any problems. 如果您仔细查看错误消息,则将DATETIMEDATETIME2进行比较并不是问题,SQL Server可以将其完成而没有任何问题。

You have something stored as string but you are trying to convert it to DATETIME2 . 您已将某些内容存储为字符串,但是您正在尝试将其转换为DATETIME2

To convert to DATETIME2 is done like other converts CONVERT (DATETIME2, MyDatetimeField) 转换为DATETIME2方式与其他转换CONVERT (DATETIME2, MyDatetimeField)

just know that DATETIME2 has higher precision than DATETIME . 只知道DATETIME2DATETIME具有更高的精度。 Your data will not change, only new information added with higher precision will use it. 您的数据不会改变,只有添加了更高精确度的新信息才能使用它。

Look at the following example. 看下面的例子。 Both rows will produce same result. 两行将产生相同的结果。

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

SELECT @Datetime
UNION ALL
SELECT CONVERT(DATETIME2, @Datetime)

but in the following case 但在以下情况下

DECLARE @datetime2 DATETIME2 = SYSDATETIME();

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

first select will produce higher precision point than second one 第一选择将产生比第二选择更高的精度点

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM