将我的日期列转换为" 2015-08-24 12:05:19.000"到日期和分钟值

时间:2016-12-19 04:08:03

标签: sql sql-server datetime

SQL Server查询将2015-08-24 12:05:19.000之类的日期列转换为日期和分钟值。

例如,2015-08-24 12:05:19.000应转换为2015-08-24 0.0833,即(5/60=0.083)小时。即12.05是在12点钟的5分钟和那个小时的5/60分数。

任何建议或请求查询帮助。转换或任何其他正常日期函数对我没有帮助。请注意,这是包含日期行的单日期列。我不希望多列之间存在日期差异。

4 个答案:

答案 0 :(得分:1)

您可以考虑仅将DATEDIFFTIME部分一起使用,并利用CONVERT中的格式选项来简化输出。由于这可能会按照您的建议在报告中全部使用,也可以将其包装到标量函数中(然后在报告查询中使用它,甚至在计算字段中使用)。

CREATE FUNCTION dbo.f_GetDateValue(
    @Date DATETIME,
    @Digits INT = 4 -- How many digits of precision?
) RETURNS VARCHAR(50) AS
BEGIN

    -- Calculate decimal to millisecond level
    DECLARE @Decimal NUMERIC(9,0) = ROUND(CONVERT(NUMERIC(9,0),
        DATEDIFF(MS, 0, CONVERT(TIME, @Date)))/86400000, @Digits)

    -- Return formatted date and time as decimal
    RETURN CONVERT(CHAR(10), @Date, 121) -- Format date as yyyy-MM-dd
        + ' ' -- Separate date and time value
        + LEFT(CONVERT(VARCHAR(50), @Decimal), @Digits + 2) -- 2 for "0." and rounded @Digits
END
GO   

使用上面的标量函数,您的查询就是:

SELECT dbo.f_GetDateValue(GETDATE(), DEFAULT) -- Gets "yyyy-MM-dd 0.0000"
SELECT dbo.f_GetDateValue(GETDATE(), 2) -- Gets "yyyy-MM-dd 0.00"

如评论和其他答案中所述,您无法更改SQL存储日期值的方式。这仅创建基于文本的表示,其仅与文本的格式一样可排序。幸运的是,由于您使用的是YYYY-MM-DD 0.0000,因此在大多数报告中这应该可以作为文本本身进行排序。

答案 1 :(得分:0)

您无法控制sql存储日期时间列的方式,但您可以从SELECT查询中获取自己的格式:

CONVERT(CHAR(10), [DATECOLUMN], 121)  + '  ' + 
       CAST(CAST((DATEPART(MINUTE,[DATECOLUMN]) as float)/ Cast(60 as float)) a varchar(5)) 
FROM MYTABLE

如果您想显示包含01等2个字符的月份和日期,即使它们小于10,您也可以使用

CONVERT(CHAR(10), [DATECOLUMN], 121)  + '  ' + 
       CAST(CAST((DATEPART(MINUTE,[DATECOLUMN]) as float)/ Cast(60 as float)) a varchar(5)) 
FROM MYTABLE

YEAR() MONTH() DAY() DATEPART()个函数可用于获取日期部分

答案 2 :(得分:0)

DECLARE @d datetime='2015-08-24 12:05:19.000'
SELECT DATEDIFF(MINUTE,DATEADD(HOUR,12,CONVERT(VARCHAR,@d,110)),@d)/60.0

SELECT CONVERT(VARCHAR,@d,23)+' '+CONVERT(VARCHAR, DATEDIFF(MINUTE,DATEADD(HOUR,12,CONVERT(VARCHAR,@d,110)),@d)/60.0)

--2015-08-24 0.083333

答案 3 :(得分:0)

此代码完美地运行,假设用户只需要获得该小时的唯一小时分数。有关参考,请查看输出的快照 enter image description here

select Cast(Convert(Date,'2015-08-24 12:05:19.000') AS nvarchar)
+' '+Cast(DATEPART(hour,'2015-08-24 12:05:19.000') AS nvarchar)
+' '+Cast(Convert(float,(datepart(MINUTE,'2015-08-24 12:05:19.000')))/60 
AS nvarchar)