Sql server 转换select语句中的日期格式

Sql server 转换select语句中的日期格式,sql-server,tsql,date,type-conversion,Sql Server,Tsql,Date,Type Conversion,我正在尝试将输出中的日期转换为dd-mm-yyyy格式。我已经尝试仅转换日期,但如何仅在select语句显示输出时转换日期 例如,这是我的查询 select * from dbo.Car where dbo.Car.[Date Registered] > DATEADD(year, -3, GetDate()) and dbo.Car.rentalCost < 350 ORDER by [Date Registered] desc, brand a

我正在尝试将输出中的日期转换为
dd-mm-yyyy
格式。我已经尝试仅转换日期,但如何仅在select语句显示输出时转换日期

例如,这是我的查询

select * 
from dbo.Car 
where 
    dbo.Car.[Date Registered] > DATEADD(year, -3, GetDate()) 
    and dbo.Car.rentalCost < 350 
ORDER by 
    [Date Registered] desc, brand asc;

有更简单的解决方案吗?

我认为最好在select语句中指定每个列名,并使用以下日期列:

select col1, col3, col3, CONVERT(varchar(10),[Date Registered], 105), col5, col6, col7
from dbo.Car 
where dbo.Car.[Date Registered] > DATEADD(year, -3, GetDate()) and  dbo.Car.rentalCost < 350 
ORDER by [Date Registered] desc, brand asc;
选择col1、col3、col3、CONVERT(varchar(10),[Date Registered],105)、col5、col6、col7
从dbo。汽车
其中dbo.Car.[Date Registered]>DATEADD(year,-3,GetDate())和dbo.Car.rentalCost<350
按[注册日期]说明订购,品牌asc;

我创建了这个SP,它动态创建一个列列表,并将所有具有Datetime和Date数据类型的列转换为dd mm yyyy。至少它将有助于手动编写大量转换

CREATE PROCEDURE usp_ColumnToStringDate(@p_TableName SYSNAME, @p_FilterString VARCHAR(4000) = NULL)
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @TableName SYSNAME
    DECLARE @ColumnName SYSNAME
    DECLARE @SchemaName SYSNAME
    DECLARE @DataType SYSNAME
    DECLARE @StartLoop INT
    DECLARE @EndLoop INT
    DECLARE @SQLColumnList VARCHAR(4000)
    DECLARE @SQL VARCHAR(4000)
    DECLARE @FilterString VARCHAR(4000)


    SET @TableName = @p_TableName
    SET @FilterString = @p_FilterString

    DECLARE @TargetTable TABLE (
                OrderID INT IDENTITY(1, 1),
                TableSchema SYSNAME,
                TableName SYSNAME,
                ColumnName SYSNAME,
                DataType SYSNAME
            )

    INSERT INTO @TargetTable
    SELECT   QUOTENAME(c.TABLE_SCHEMA),
             QUOTENAME(c.TABLE_NAME),
             QUOTENAME(c.COLUMN_NAME),
             UPPER(c.DATA_TYPE)
    FROM     INFORMATION_SCHEMA.COLUMNS c
    WHERE    c.TABLE_NAME = @TableName
    ORDER BY c.ORDINAL_POSITION

    --SELECT * FROM @TargetTable

    SELECT   @StartLoop = MIN(tt.OrderID),
             @EndLoop        = MAX(tt.OrderID),
             @SchemaName     = MIN(tt.TableSchema),
             @TableName      = MIN(tt.TableName)
    FROM     @TargetTable tt

    WHILE @StartLoop <= @EndLoop
    BEGIN
        SELECT   @DataType = tt.DataType,
                 @ColumnName = tt.ColumnName
        FROM     @TargetTable tt
        WHERE    tt.OrderID = @StartLoop

        --PRINT @ColumnName+' '+@DataType

        SET @SQLColumnList = ISNULL(@SQLColumnList, '')
            + CASE 
                   WHEN @DataType IN ('DATETIME', 'DATE') THEN CHAR(9) + CHAR(9)
                        + 'CONVERT(VARCHAR(10),' + @ColumnName + ', 105)'
                   ELSE CHAR(9) + CHAR(9) + @ColumnName
              END

        IF @StartLoop != @EndLoop
        BEGIN
            SET @SQLColumnList = @SQLColumnList + ',' + CHAR(13) + CHAR(10)
        END

        IF @StartLoop = 1
        BEGIN
            SET @SQLColumnList = 'SELECT' + REPLACE(@SQLColumnList, CHAR(9), ' ')
        END


        SET @StartLoop = @StartLoop + 1
    END
    SET @SQL = @SQLColumnList + CHAR(13) + CHAR(10) + 'FROM ' + @TableName + CHAR(13) + CHAR(10)
    SET @SQL = COALESCE(@SQL+@FilterString,@SQL)
    PRINT @SQL
END 

是的,差不多是我的第二个孩子,所以没有更简单的解决办法?我在想如果有几百个专栏呢?这些列是从其他查询动态更改的。如果您只想基于另一个查询转换特定的列,您可以查看动态sql…@JackyBoi,最简单的方法是让应用程序团队处理它,或者您可以编写一个动态SQL来从Information_Schema.Columns检索所有日期时间字段,并编写一个案例来转换这些列。如果尽可能将日期格式保留给应用程序或报告软件,请不要在查询中指定它。谢谢,我需要一些时间才能理解这一点。@JackyBoi,当然可以,但如果需要,请随时询问我的澄清。快乐编码。
CREATE PROCEDURE usp_ColumnToStringDate(@p_TableName SYSNAME, @p_FilterString VARCHAR(4000) = NULL)
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @TableName SYSNAME
    DECLARE @ColumnName SYSNAME
    DECLARE @SchemaName SYSNAME
    DECLARE @DataType SYSNAME
    DECLARE @StartLoop INT
    DECLARE @EndLoop INT
    DECLARE @SQLColumnList VARCHAR(4000)
    DECLARE @SQL VARCHAR(4000)
    DECLARE @FilterString VARCHAR(4000)


    SET @TableName = @p_TableName
    SET @FilterString = @p_FilterString

    DECLARE @TargetTable TABLE (
                OrderID INT IDENTITY(1, 1),
                TableSchema SYSNAME,
                TableName SYSNAME,
                ColumnName SYSNAME,
                DataType SYSNAME
            )

    INSERT INTO @TargetTable
    SELECT   QUOTENAME(c.TABLE_SCHEMA),
             QUOTENAME(c.TABLE_NAME),
             QUOTENAME(c.COLUMN_NAME),
             UPPER(c.DATA_TYPE)
    FROM     INFORMATION_SCHEMA.COLUMNS c
    WHERE    c.TABLE_NAME = @TableName
    ORDER BY c.ORDINAL_POSITION

    --SELECT * FROM @TargetTable

    SELECT   @StartLoop = MIN(tt.OrderID),
             @EndLoop        = MAX(tt.OrderID),
             @SchemaName     = MIN(tt.TableSchema),
             @TableName      = MIN(tt.TableName)
    FROM     @TargetTable tt

    WHILE @StartLoop <= @EndLoop
    BEGIN
        SELECT   @DataType = tt.DataType,
                 @ColumnName = tt.ColumnName
        FROM     @TargetTable tt
        WHERE    tt.OrderID = @StartLoop

        --PRINT @ColumnName+' '+@DataType

        SET @SQLColumnList = ISNULL(@SQLColumnList, '')
            + CASE 
                   WHEN @DataType IN ('DATETIME', 'DATE') THEN CHAR(9) + CHAR(9)
                        + 'CONVERT(VARCHAR(10),' + @ColumnName + ', 105)'
                   ELSE CHAR(9) + CHAR(9) + @ColumnName
              END

        IF @StartLoop != @EndLoop
        BEGIN
            SET @SQLColumnList = @SQLColumnList + ',' + CHAR(13) + CHAR(10)
        END

        IF @StartLoop = 1
        BEGIN
            SET @SQLColumnList = 'SELECT' + REPLACE(@SQLColumnList, CHAR(9), ' ')
        END


        SET @StartLoop = @StartLoop + 1
    END
    SET @SQL = @SQLColumnList + CHAR(13) + CHAR(10) + 'FROM ' + @TableName + CHAR(13) + CHAR(10)
    SET @SQL = COALESCE(@SQL+@FilterString,@SQL)
    PRINT @SQL
END 
--SELECT Statement
EXEC usp_ColumnToStringDate 'ProductListPriceHistory',NULL

--SELECT Statement with Filter
EXEC usp_ColumnToStringDate 'ProductListPriceHistory','WHERE ProductID = ''1'''

--Use in other SP or assign to parameters
DECLARE @DSQL VARCHAR(MAX)

EXEC @DSQL =  usp_ColumnToStringDate 'ProductListPriceHistory','WHERE ProductID = ''1'''
PRINT REVERSE(SUBSTRING(REVERSE(@DSQL),2,LEN(@DSQL)))