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

本文关键字:日期 显示 非正式 MSSQL 过程 是否 格式化 | 更新日期: 2023-09-27 18:00:25

我希望日期和时间在我的页面上显示为这样的内容:-

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

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

2011-02-08 13:14:44.513

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

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

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

  • 数据输入、数据输出(任何形式的查询/操作)
  • 健壮的持久性、完整性、原子性等(ACID)
  • 没有其他

当然,可以在DB中设置格式,但为什么要?这应该在你的应用层中完成,允许:

  • 缓存和重用不变的2011-02-08 13:14:44.513(其中"1分钟前"随时间不断变化)-缓存数据等
  • 国际化与本土化
  • UI的正确编码(是html?xml?xaml?csv?txt?winforms?)-数据库不应该知道有关UI的
  • 扩展"out"而不是"up"-不要在数据库中做超出您需要的事情;多个应用服务器比超级强大的数据库服务器便宜

至于"在我的aspx页面后面的代码中编码",你也不需要这样做;p(但是,我非常偏爱MVC+剃刀)

据我所知,没有内置函数可以做到这一点,但是一个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

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

在一系列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

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

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