TSQL - 如何格式化查询结果?

4

我有这个查询:

select SentDate, SentTime, SeenDate, SeenTime
from Sents

结果像这样:
/////////////////////////////////////////////////////////
SentDate      SentTime      SeenDate         SeenTime
/////////////////////////////////////////////////////////
1394/01/09    10:44         1394/01/22         13:27     
1394/01/15    7:15          1394/01/22         14:41     
1394/01/15    7:21          1394/01/22         13:18     
1394/01/15    7:31          1394/01/22         14:47     
1394/01/15    8:28          1394/01/22         13:00     
1394/01/15    11:20         1394/01/22         13:41     
1394/01/16    9:9           1394/01/22         12:56     
1394/01/17    07:48         1394/01/22         12:58     
1394/01/17    07:49         1394/01/22         13:28     
1394/01/18    12:53         1394/01/22         14:43     
1394/01/19    10:33         1394/01/22         14:42     
1394/01/19    11:49         1394/01/22         10:59     
1394/01/20    08:00         1394/01/22         12:54     
1394/01/20    9:43          1394/01/22         10:52     
1394/01/20    9:51          1394/01/22         10:51     
1394/01/22    6:47          1394/01/22         10:50     
1394/01/22    6:50          1394/01/22         10:49     
1394/01/22    8:31          1394/01/22         10:39     
1394/01/22    9:12          1394/01/22         10:38
1394/01/22    9:12 PM       1394/01/22         10:38 PM
1394/01/23    09:10 PM      1394/01/22         10:9 AM 

正如您所看到的,日期(SentDate,SeenDate)在格式上是正确的,我的意思是它们的模式为^(\d{4})[-/](\d\d)[-/](\d\d(?:\d\d)?)。问题出在SentTime和SeenTime上,我想将它们格式化为(\d{2}):(\d{2})。 首先,我已经尝试了通过以下方式获取前5个字符:

select SentDate,LTRim(RTRIM(SUBSTRING(SentTime,1,5))), SeenDate, LTRim(RTRIM(SUBSTRING(SeenTime,1,5)))
from erja

但是我不知道如何格式化像7:1507:57:7这样的值
有什么想法吗?

PS:在结果中,时间也会出现这些类型的值:

11:45 ق
11:45 ب

你的字段是什么类型?另外,我建议您提及您的SQL服务器版本。 - Rohit Vipin Mathews
@Rohit,它们的类型是char(10),SQL Server的版本是2012。 - Sirwan Afifi
由于你的字段是 char 而不是 DateTimeDateTime 且没有遵循任何格式,因此你将不得不使用大量的 CASE-WHEN-THEN - Rohit Vipin Mathews
进一步说,9:12是上午9点12分还是下午9点12分?你的数据含糊不清。 - Nick.McDermaid
抱歉,我不知道“ق”和“ب”的意思,它们是指上午还是下午? - Eric
@Eric ب代表波斯语中的下午,ق代表上午。 - Sirwan Afifi
1个回答

4

将其转换为日期时间,然后再转换回字符

SELECT 
    Value, REPLACE(REPLACE(Value, N'ق', 'AM'), N'ب', 'PM') AS ReplacedValue,
    CONVERT(varchar(5), 
    CONVERT(datetime, 
        REPLACE(REPLACE(Value, N'ق', 'AM'), N'ب', 'PM')
    )
    , 108) AS FormatTime 
FROM    
    (values
        ('10:9 AM'),
        ('09:10 PM '), 
        ('9:12 PM'), 
        ('9:12'), 
        ('07:5'), 
        ('7:7'),
        (N'11:45 ق'),
        (N'11:45 ب')
    ) data(Value)

结果

Value     ReplacedValue FormatTime
--------- ------------- ----------
10:9 AM   10:9 AM       10:09
09:10 PM  09:10 PM      21:10
9:12 PM   9:12 PM       21:12
9:12      9:12          09:12
07:5      07:5          07:05
7:7       7:7           07:07
11:45 ق   11:45 AM      11:45
11:45 ب   11:45 PM      23:45

1
但是由于示例数据中附加了AMPM,所以您无法确定9:12是什么意思。 - Rohit Vipin Mathews
1
@Rohit 没错,让我们看看OP会加入什么。 - Eric
谢谢,但是这种类型的值:07:5 ق 该怎么办? - Sirwan Afifi
1
CONVERT() 永远让我惊叹不已... :) - SQL Tactics
@SirwanAfifi 请看编辑。我不确定SQL服务器是否能比“REPLACE()”更好地处理其他语言。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接