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