是否可以在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页面的代码后面进行编码?
数据库只是格式化东西的错误级别。这是工作:
- 数据输入、数据输出(任何形式的查询/操作)
- 健壮的持久性、完整性、原子性等(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)。检查可用的日期和时间样式。
在一系列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
我会在页面中对其进行编码。
除了Mark G的回答之外,您可能不会在刷新时调用带有缓存等的数据库,因为数据库中的数据可能不会更改。但是您在网页(服务器)中仍然有当前时间和数据库记录时间