只在同一列中的日期和时间--sql server

pun*_*ter 0 sql sql-server sql-server-2008

我有一个门户网站,如果日期是今天的日期,应该只显示时间,否则它应该显示日期.

dossier_date_created       |   Expected result
----------------------------------------------------
2013-10-22 16:18:46.610    |     2013-10-22
2013-10-23 11:26:56.390    |     11:26
Run Code Online (Sandbox Code Playgroud)

我试过这样的事情:

select 
case 
when CONVERT(date,dossier_date_created) = CONVERT(DATE,getdate()) then convert(char(5), dossier_date_created, 108) 
else convert(date, dossier_date_created) 
end as timedate
 from Proj_Manage_Dossier
Run Code Online (Sandbox Code Playgroud)

但结果是:

     timedate
    -----------
    2013-10-22
    1900-01-01
Run Code Online (Sandbox Code Playgroud)

我怎么能只用SQL做?我的专栏"dossier_date_created"的btw数据类型是datetime

Nen*_*vic 5

您可以使用CASTCONVERT获取值DATETIME数据类型.但是,由于你不能在同一列中组合两种数据类型,你必须将它们都转换成相同的东西 - 比如NVARCHAR之后:

SELECT CASE WHEN CAST(dossier_date_created AS DATE) = CAST(GETDATE() AS DATE) 
            THEN CAST(CAST (dossier_date_created AS TIME) AS NVARCHAR(10))
    ELSE CAST(CAST(dossier_date_created AS DATE) AS NVARCHAR(10)) END
FROM dbo.Proj_Manage_Dossier
Run Code Online (Sandbox Code Playgroud)

SQLFiddle DEMO

编辑 -对于SQL Server版本较旧的然后2008年,那里有没有日期和时间数据类型-您也可以直接CONVERTVARCHAR 使用适当的样式代码.

SELECT CASE WHEN CONVERT(VARCHAR(10),dossier_date_created,102) = CONVERT(VARCHAR(12),GETDATE(),102)
            THEN CONVERT(VARCHAR(10),dossier_date_created,108)
    ELSE CONVERT(VARCHAR(10),dossier_date_created,102) END
FROM dbo.Proj_Manage_Dossier
Run Code Online (Sandbox Code Playgroud)

SQLFiddle DEMO