是否可以在MSSQL过程本身格式化日期,以便它可以显示为非正式日期?

时间:2011-06-27 13:44:27

标签: c# asp.net sql-server

我希望在我的页面上显示日期和时间: -

 1 minute ago
25 minutes ago
45 minutes ago
4 hours ago
3 weeks ago

我的存储过程以下列格式返回日期: -

2011-02-08 13:14:44.513

我可以按照我希望它仅在SP中显示的方式进行格式化,还是必须在我的aspx页面后面的代码中进行编码?

5 个答案:

答案 0 :(得分:5)

数据库只是错误级别要格式化的东西。这是工作:

  • 数据输入,数据输出(以任何形式查询/操作)
  • 强大的持久性,完整性,原子性等(ACID)
  • ,没有别的

当然,您可以格式化数据库,但为什么要?这应该在您的应用层中完成,允许:

  • 缓存并重用不变的2011-02-08 13:14:44.513(其中 - “1分钟前”随时间不断变化) - 缓存数据等
  • 国际化和本地化
  • UI的正确编码(是html?xml?xaml?csv?txt?winforms?) - 数据库 不应该知道 关于用户界面
  • 缩放“out”而不是“up” - 在数据库中不要超过你需要的数量;多个应用服务器比超强大的数据库服务器便宜

至于“我的aspx页面后面的代码编码”,你也不需要这样做; p(但是,我很偏爱MVC + razor)

答案 1 :(得分:1)

使用CAST and CONVERT (Transact-SQL)。检查可用的日期和时间样式

答案 2 :(得分:1)

在一系列IfCASE语句中使用DATEDIFF功能可以获得您想要的内容。但是,根据选择,在您的应用程序中执行它可能会更好。

这是一个可以为您提供所需内容的功能:

CREATE FUNCTION GetFriendlyElapsedTimePeriod 
(
    @ElapsedDateTime DATETIME
)
RETURNS VARCHAR(50)
AS
BEGIN

DECLARE @ElapsedDateTime DATETIME, @currentDate DATETIME, @elapsed INT, @period VARCHAR(10)

SET @currentDate = GETDATE()

--USE DAY instead of WEEK so that if the day in the past is Sunday 
--and today is Monday it will return 1 day rather than 1 week
IF (DATEDIFF(DAY, @elapsedDateTime, @currentDate) > 6) 
BEGIN
    SET @period  = 'week'
    SET @elapsed = CONVERT(INT, CONVERT(DECIMAL, DATEDIFF(DAY, @elapsedDateTime, @currentDate)) / 7.0)
END
ELSE IF (DATEDIFF(DAY, @elapsedDateTime, @currentDate) > 0)
BEGIN
    SET @period  = 'day'
    SET @elapsed = DATEDIFF(DAY, @elapsedDateTime, @currentDate)
END
ELSE IF (DATEDIFF(HOUR, @elapsedDateTime, @currentDate) > 0)
BEGIN
    SET @period  = 'hour'
    SET @elapsed = DATEDIFF(HOUR, @elapsedDateTime, @currentDate)
END
ELSE IF (DATEDIFF(MINUTE, @elapsedDateTime, @currentDate) > 0)
BEGIN
    SET @period  = 'minute'
    SET @elapsed = DATEDIFF(MINUTE, @elapsedDateTime, @currentDate)
END

IF (@elapsed > 1)
BEGIN
    SET @period = @period + 's'
END 

RETURN CONVERT(VARCHAR(10), @elapsed) + ' ' + @period + ' ago'

END
GO

答案 3 :(得分:1)

据我所知,没有内置函数来执行此操作,但是case语句和一些数学可以返回你想要的内容。

我同意它应该在应用程序后面而不是在数据库级别上完成,但事实并非如此。这里有一些代码我把它们放在一起作为一个例子,你应该可以根据自己的需要进行修改。

    DECLARE @SecDifference INTEGER

    DECLARE @OutPut nvarchar(25)

    DECLARE @CheckDate DATETIME

    SET @CheckDate = '2011-03-06 06:01:58.187'


    SET @SecDifference = (SELECT DATEDIFF(ss, @CheckDate ,GETDATE()))

    SET @OutPut = (CASE WHEN @SecDifference < 61 THEN CONVERT(VARCHAR(10), @SecDifference/60) + ' minute ago' 
                WHEN @SecDifference > 60 AND @SecDIfference <= 3600 THEN CONVERT(VARCHAR(10), @SecDifference/60) + ' minutes ago' 
                WHEN @SecDifference > 3600 AND @SecDifference <= 86400 THEN  CONVERT(VARCHAR(10), @SecDifference/3600) + ' hours ago' 
                WHEN @SecDifference > 86400 AND @SecDifference <= 604800 THEN CONVERT(VARCHAR(10), @SecDifference/86400) + ' Day(s) ago' 
                WHEN @SecDifference > 604800 AND @SecDifference <= 2419200 THEN CONVERT(VARCHAR(10), @SecDifference/604800) + ' Week(s) ago' 
                WHEN @SecDifference > 2419200 AND @SecDifference < 29030400 THEN CONVERT(VARCHAR(10), @SecDifference/2419200) + ' Month(s) ago' 
                ELSE 'NOT' END)

    SELECT @OutPut
    --RETURN @OutPut

答案 4 :(得分:1)

我会在页面中对其进行编码。

除了Mark G的答案之外,您可能无法在刷新时使用缓存等来调用数据库,因为数据库中的数据可能不会更改。但是您仍然在网页(服务器)中有当前时间和数据库记录时间