我希望在我的页面上显示日期和时间: -
1 minute ago
25 minutes ago
45 minutes ago
4 hours ago
3 weeks ago
我的存储过程以下列格式返回日期: -
2011-02-08 13:14:44.513
我可以按照我希望它仅在SP中显示的方式进行格式化,还是必须在我的aspx页面后面的代码中进行编码?
答案 0 :(得分:5)
数据库只是错误级别要格式化的东西。这是工作:
当然,您可以格式化数据库,但为什么要?这应该在您的应用层中完成,允许:
2011-02-08 13:14:44.513
(其中 - “1分钟前”随时间不断变化) - 缓存数据等至于“我的aspx页面后面的代码编码”,你也不需要这样做; p(但是,我很偏爱MVC + razor)
答案 1 :(得分:1)
使用CAST and CONVERT (Transact-SQL)。检查可用的日期和时间样式。
答案 2 :(得分:1)
在一系列If
或CASE
语句中使用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的答案之外,您可能无法在刷新时使用缓存等来调用数据库,因为数据库中的数据可能不会更改。但是您仍然在网页(服务器)中有当前时间和数据库记录时间