如何在Sql server中根据日期和时间获取最新记录

如何在Sql server中根据日期和时间获取最新记录,sql,sql-server,Sql,Sql Server,我试图根据日期和时间获取最新记录,但列中包含的时间是12小时am/PM格式 假设我的记录在 2015-09-07 12:50:37.1983315下午-创下这一纪录 2015-09-07 03:12:15.1983315下午-实际上我需要得到这张唱片 上面的结果来自下面的查询 SELECT top 10 * FROM SHAdminMessageIndex where Appid='62001308607984608300' and PolicyNumber='0081317' order

我试图根据日期和时间获取最新记录,但列中包含的时间是12小时am/PM格式

假设我的记录在

2015-09-07 12:50:37.1983315下午-创下这一纪录

2015-09-07 03:12:15.1983315下午-实际上我需要得到这张唱片

上面的结果来自下面的查询

 SELECT top 10 * FROM SHAdminMessageIndex where Appid='62001308607984608300' and 
 PolicyNumber='0081317' order by BeginTime desc
那么,如何通过使用12小时格式的AM和PM来获得结果呢。提前感谢

试试这个

SELECT top 10 * FROM SHAdminMessageIndex where Appid='62001308607984608300'   
and  PolicyNumber='0081317' order by  stuff(convert(varchar(19), BeginTime,  
126),11,1,' ') desc
 SELECT top 10 * FROM SHAdminMessageIndex 
    where Appid='62001308607984608300' and  PolicyNumber='0081317' 
    order by 
    cast(BeginTime as datetime2)  desc
试试这个

SELECT top 10 * FROM SHAdminMessageIndex where Appid='62001308607984608300'   
and  PolicyNumber='0081317' order by  stuff(convert(varchar(19), BeginTime,  
126),11,1,' ') desc
 SELECT top 10 * FROM SHAdminMessageIndex 
    where Appid='62001308607984608300' and  PolicyNumber='0081317' 
    order by 
    cast(BeginTime as datetime2)  desc


你想要每天的第一张唱片吗?您可以按日期分组,并在每组中取第一个。因此,使用排序函数,如
行数
CTE

WITH CTE AS
(
    SELECT t.*, 
           RN = ROW_NUMBER() OVER (PARTITION BY CAST(BeginTime AS Date) ORDER BY BeginTime )
    FROM SHAdminMessageIndex t
    WHERE Appid='62001308607984608300' 
    AND   PolicyNumber='0081317'
)
SELECT TOP 10 CTE.* 
FROM CTE 
WHERE RN = 1
ORDER BY BeginTime DESC

这就是为什么我们应该始终使用适当的数据类型来存储数据。尝试将
BeginTime
强制转换为
DATETIME2

SELECT top 10 * 
FROM SHAdminMessageIndex 
where Appid='62001308607984608300' 
and PolicyNumber='0081317' 
order by Cast(BeginTime  AS DATETIME2) DESC

使用PARSE将字符串转换为DATETIME2

select top 10 * 
from SHAdminMessageIndex 
where Appid='62001308607984608300' and PolicyNumber='0081317'
order by parse(BeginTime as datetime2 using 'en-US') desc;
确保指定不依赖于会话设置的语言-您的datetime字符串可能不是另一种语言的有效datetime(在许多语言中PM和AM无效)


SQL FIDLE:。

列BeginTime上的数据类型是什么?您想要每天的第一条记录吗?您使用的是哪个sql server版本?所以您将日期和时间存储在字符串中?不是约会时间吗?为什么?更改您的表以便使用datetime,查询数据将不会有问题。您应该这样做,您的问题将得到缓解,但您的标题与示例数据冲突,标题表明您需要“最新”记录,但在您的示例中,您表示想要的日期是这两个日期中最早的一个?@Sanjay如果可能,请立即修复此列的数据类型。必须在convert/cast中包装该列,并将其作为where或order by的一部分,这将导致扫描整个表(性能一直很差)。很抱歉没有提及。数据类型为nvarchar。