1

我正在尝试将日期时间值转换为特定格式,但没有任何样式代码似乎符合我的要求。我尝试了有关样式代码的 SQLUSA 帖子,但没有一个是完全正确的。

我有一列将日期/时间存储为yyyy-mm-dd hh:nn:ss (24 小时制)

我有一个选择声明,如果我想使用此列,但将日期表示为:mm/dd/yyyy hh:nn:ss AM/PM

我最接近的是:

CONVERT(varchar,[datetimecolum],22) AS [newcolumnname]

但这只会给我一个 2 位数的年份,而不是一个世纪年(yyyy)。

有任何想法吗?我完全迷路了。:(

4

5 回答 5

2

首先,日期时间字段不是以特定的字符串格式存储的,而是作为序列号存储的。因此,您在屏幕上看到的不是存储的内容,而是您的数据库工具对日期的默认呈现。其次,你为什么要在 SQL 中这样做?如果您将值传递给应用程序,请从本机类型进行转换。第三,我认为 22 不是 TSQL 中的有效转换代码。检查http://msdn.microsoft.com/en-us/library/ms187928.aspx,了解更多信息。

于 2012-09-13T22:07:48.473 回答
1

来自:http: //msdn.microsoft.com/en-us/library/ms187928.aspx

从列出的所有其他格式来看,它会推断只需在格式编号上添加 100 即可获得“与世纪”(yyyy)。

虽然根据文档(和我的测试)没有格式 22(或 122) - 所以你必须结合其他两种格式才能得到你需要的:

CONVERT(varchar,[datetimecolum],101) + ' ' + CONVERT(varchar,[datetimecolum],108) AS [newcolumnname]

SQLFiddle 演示

于 2012-09-13T21:59:16.333 回答
0

我认为这样做

  select stuff(convert(varchar(20),getdate(),22),7,2,
  CAST( DATEPART(yyyy,getdate()) as CHAR(4)))

这很接近,但没有 AM PM

  select convert(varchar(100),getdate(),22), 
   + ' ' + CAST(DATEPART(mm,getdate()) as CHAR(2))
   + '/' + CAST( DATEPART(dd,getdate()) as CHAR(2))
   + '/' + CAST( DATEPART(yyyy,getdate()) as CHAR(4))
   + ' ' + CAST(DATEPART(HH,getdate()) as CHAR(2))
   + ':' + CAST(DATEPART(mi,getdate()) as CHAR(2))
   + ':' + CAST(DATEPART(ss,getdate()) as CHAR(2))
于 2012-09-13T22:46:07.107 回答
0

这比我原来的更笨重,但它有效,除了你不会在几小时或几分钟内得到前导零。您也可以修改此代码以执行此操作,但那样会变得非常混乱,所以我把它留给您 ;-)

换句话说,如果日期 + 时间是

2012 年 3 月 1 日晚上 10:01:35,

你会得到:

2012 年 3 月 1 日晚上 10:1:35

烦人,嗯?

无论如何,给你。希望这可以帮助。

SELECT dt.ID,
CASE WHEN EXISTS(SELECT DATEPART(HH, mt.TheDate)
                FROM MyTable AS mt 
                WHERE mt.ID = dt.ID 
                AND (DATEPART(HH, mt.TheDate)) > 12)
    THEN
        (SELECT
        CONVERT(varchar,(MONTH(dt.TheDate))) + '/' +
        CONVERT(varchar,(DAY(dt.TheDate))) + '/' +
        CONVERT(varchar,(YEAR(dt.TheDate))) + ' ' +
        CONVERT(varchar, DATEPART(HH, dt.TheDate)-12) + ':' +
        CONVERT(varchar,(DATEPART(mi, dt.TheDate))) + ':' +
        CONVERT(varchar,(DATEPART( ss, dt.TheDate))) + ' PM')
    ELSE
        (SELECT
        CONVERT(varchar,(MONTH(dt.TheDate))) + '/' +
        CONVERT(varchar,(DAY(dt.TheDate))) + '/' +
        CONVERT(varchar,(YEAR(dt.TheDate))) + ' ' +
        CONVERT(varchar, DATEPART(HH, dt.TheDate)) + ':' +
        CONVERT(varchar,(DATEPART(mi, dt.TheDate))) + ':' +
        CONVERT(varchar,(DATEPART( ss, dt.TheDate))) + ' AM') END As FullDate
FROM MyTable AS dt
于 2012-09-13T22:07:57.443 回答
0

你需要分两部分来做,你需要使用东西来删除毫秒。如果找到其他方法来摆脱毫秒,我会更新

SELECT CONVERT(VARCHAR(10), GETDATE(), 101)+' '+STUFF(RIGHT(CONVERT(VARCHAR(26), GETDATE(), 109),14),9,4,'')

输出 :09/13/2012 11:15:21PM

编辑:如果你想要在 AM/PM 之前有空间,然后使用' '而不是''in stuff

SELECT CONVERT(VARCHAR(10), GETDATE(), 101)+' '+STUFF(RIGHT(CONVERT(VARCHAR(26), GETDATE(), 109),14),9,4,' ')

输出 :09/13/2012 11:15:59 PM

于 2012-09-14T00:10:50.633 回答