将 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 转换为日期时间/日期后的计算的主要内容,如果未能解决你的问题,请参考以下文章