将 nvarchar 转换为日期时间/日期后的计算

Posted

技术标签:

【中文标题】将 nvarchar 转换为日期时间/日期后的计算【英文标题】:calculation after converting nvarchar to datetime/date 【发布时间】:2021-11-12 17:50:58 【问题描述】:

我正在尝试将这种计算从 Excel 模拟到 T-SQL 中。

第一个值是“7/25/2021 6:44:00 AM”

第二个值是“7/25/2021 1:10:00 PM”

我正在尝试提出 0.35138 的值..

在 SQL 表中,这两个值当前都是 nvarchar(max) 数据类型。

我正在尝试编写 SQL 函数,但我陷入了转换或转换过程并计算两个值。

到目前为止,这就是我所拥有的:

 CREATE FUNCTION  [dbo].[fn_break_cal] (
    @Punch_Start nvarchar(max),
    @Punch_End nvarchar(max)
 ) 

  RETURNS nvarchar(max) AS

BEGIN   
DECLARE @return_value nvarchar(max);

    SET @return_value = 
    
        CONVERT(varchar, @Punch_Start, 103)

RETURN @return_value

首先,我不确定在转换为日期或日期时间后如何进行减法。

每当我使用 Datediff 时,输出都是整数,我不知道如何将它变成像 (0.35133..) 这样的数字。

处理来自 nvarchar(max) 的数据的最佳方法是什么 --> 计算日期/日期时间?

提前致谢。

【问题讨论】:

可以添加DDL和Data试试吗? 可以添加计算吗? @Gudwlk 感谢您的帮助。赞赏。 【参考方案1】:

请参考下面添加的函数和函数调用。我不确定你为什么在函数中返回 nvarchar(max) 值。我将其更改为十进制。我使用 CAST 将 nvarchar 转换为日期时间。您也可以使用 TRY_CAST。

  ALTER FUNCTION  [dbo].[fn_break_cal] (
    @Punch_Start nvarchar(max),
    @Punch_End nvarchar(max)
    ) 

    RETURNS decimal(36, 8) AS

    BEGIN   
        DECLARE @return_value nvarchar(max);

         SET @return_value = DATEDIFF(MINUTE, CAST(@Punch_Start AS datetime2) ,  CAST(@Punch_End AS datetime2) ) / (24* 60.0)     

        RETURN @return_value
     END

带参数和返回值的函数调用:

       Select [dbo].[fn_break_cal] ('7/25/2021 6:44:00 AM','7/25/2021 15:10:00 PM') return_value

【讨论】:

【参考方案2】:
    DECLARE @ps nvarchar(30) = '7/25/2021 6:44:00 AM'
    DECLARE @pe nvarchar(30) = '7/25/2021 15:10:00 PM'
    
    SELECT
      DATEDIFF(MINUTE, TRY_CONVERT(datetime, @ps), TRY_CONVERT(datetime, @pe)) / (24 * 60.0) AS fraction
    
    SELECT
      LEFT(CONVERT(time, TRY_CONVERT(datetime, @pe) - TRY_CONVERT(datetime, @ps)), 5) AS ' hr : mm '

-- more than 24 hrs
DECLARE @ps nvarchar(30) = '7/25/2021 6:44:00 AM'
DECLARE @pe nvarchar(30) = '7/27/2021 15:10:00 PM'

SELECT
  CONCAT((DATEDIFF(MINUTE, TRY_CONVERT(datetime, @ps), TRY_CONVERT(datetime, @pe)) / 60),
  ':',
  (DATEDIFF(MINUTE, TRY_CONVERT(datetime, @ps), TRY_CONVERT(datetime, @pe)) % 60)) ' hr : mm '

【讨论】:

以上是关于将 nvarchar 转换为日期时间/日期后的计算的主要内容,如果未能解决你的问题,请参考以下文章

SQLserver时间格式

SQLserver时间格式

SQL时间转换

将英国格式日期转换为日期时间

新手求教Java时间转换问题(增加天数后的日期输出)

将数值转换为日期时间