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
分数。
任何建议或请求查询帮助。转换或任何其他正常日期函数对我没有帮助。请注意,这是包含日期行的单日期列。我不希望多列之间存在日期差异。
答案 0 :(得分:1)
您可以考虑仅将DATEDIFF
与TIME
部分一起使用,并利用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)