SQL将日期时间格式更改为特定样式

SQL将日期时间格式更改为特定样式,sql,database,tsql,Sql,Database,Tsql,我试图将datetime值转换为特定的格式,但并没有任何样式代码能够满足我的要求。我在样式代码上尝试了SQLUSA帖子,但没有一个是完全正确的 我有一列,其中日期/时间存储为yyyy-mm-dd hh:nn:ss(24小时时间) 我有一个select语句,是我想选这一列,但将日期表示为:mm/dd/yyyy hh:nn:ss AM/PM 最接近我的是: CONVERT(varchar,[datetimecolum],22) AS [newcolumnname] 但这只给了我一个2位数的年份,而

我试图将datetime值转换为特定的格式,但并没有任何样式代码能够满足我的要求。我在样式代码上尝试了SQLUSA帖子,但没有一个是完全正确的

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

我有一个select语句,是我想选这一列,但将日期表示为:mm/dd/yyyy hh:nn:ss AM/PM

最接近我的是:

CONVERT(varchar,[datetimecolum],22) AS [newcolumnname]
但这只给了我一个2位数的年份,而不是一个世纪年(yyyy)

有什么想法吗?我完全迷路了(

来自:

根据列出的所有其他格式判断,它将推断只需在格式编号上加上100即可得到“with century”(yyyy)

虽然根据文档(和我的测试)没有22(或122)格式,但您必须结合其他两种格式才能获得所需的格式:

CONVERT(varchar,[datetimecoln],101)+''+CONVERT(varchar,[datetimecoln],108)为[newcolumnname]


首先,datetime字段不是以特定的字符串格式存储的,而是作为序列号存储的。因此,您在屏幕上看到的不是存储的内容,而是数据库工具对日期的默认呈现。其次,为什么要在SQL中执行此操作?如果要将值传递给应用程序,请从本机类型进行转换。第三,我不认为22在TSQL中是一个有效的转换代码。请检查,以了解更多信息。

这比我原来的版本更笨重,但它可以工作,除非你在数小时或数分钟内不会得到前导零。你也可以修改此代码,但它会变得非常混乱,所以我把它留给你;-)

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

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
我想这样就行了

  select stuff(convert(varchar(20),getdate(),22),7,2,
  CAST( DATEPART(yyyy,getdate()) as CHAR(4)))
这是接近但没有上午下午

  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))

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

SELECT CONVERT(VARCHAR(10), GETDATE(), 101)+' '+STUFF(RIGHT(CONVERT(VARCHAR(26), GETDATE(), 109),14),9,4,'')
输出:
09/13/2012 11:15:21下午

编辑:如果您想在AM/PM之前留出空间,请在stuff中使用
'
而不是
'

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

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

发布了一个可以在SQL中工作的解决方案,我非常同意magos。为什么不让您的应用程序处理显示格式?不幸的是,这是我办公室的SSIS项目中使用的一个查询,必须在数据库中的我端进行“更改”:(你知道我该怎么安排时间吗?嗯,当我试着这么做的时候,时间差不多了,但是我得到了两次日期。你不应该这样做-看演示!