【问题标题】:How to pass a datetime variable into a SQL String on the correct format?如何以正确的格式将日期时间变量传递给 SQL 字符串?
【发布时间】:2019-04-10 12:22:41
【问题描述】:

我正在使用 SQL 脚本在 SQL Server 2014 Management Studio 中工作。

我的问题:我有 2 个返回日期时间的变量,即 2019-04-01 00:00:00.000,我正在尝试将这些变量添加到 SQL 字符串中,但是当我这样做时,格式会丢失并被转换至此:2019 年 4 月 1 日上午 12:00。该格式的日期在我的 SQL 脚本中不起作用

我尝试了多个转换和转换代码,但它根本不起作用,下面是我在 @InvoiceTrue 变量上得到的结果:

left join table1 payment on l.LedgerID = payment.LedgerID
left join table2 i on payment.InvoiceID = i.InvoiceID
where l.BusinessDate between 'Apr  1 2019 12:00AM' and 'Apr  7 2019 12:00AM' 
order by l.LedgerID

如果您看上面,日期时间格式会丢失。

这是我的 SQL 代码:

Declare
    @innerBeginDate datetime = '2019-04-01'
,   @innerEndDate datetime = '2019-04-07'
,   @InvoiceTrue varchar(max)

Select @InvoiceTrue = N'
    left join table1 payment on l.LedgerID = payment.LedgerID
    left join table2 i on payment.InvoiceID = i.InvoiceID
    where l.BusinessDate between ''' +  CAST(@innerBeginDate as varchar) + ''' and ''' + CAST(@innerEndDate as varchar) + ''' order by l.LedgerID'''

select @InvoiceTrue

在将参数传递到字符串后,我需要保持相同的日期时间格式,使其始终像 2019-04-01 00:00:00.000。我做错了什么?

【问题讨论】:

  • 您使用的是动态 SQL 吗?从您的问题中不清楚您要做什么。无论如何,假设您需要将日期时间格式化为字符串,只需检查您需要哪种格式的参考文档docs.microsoft.com/en-us/sql/t-sql/functions/…
  • 有什么理由需要使用dynamic query
  • 我正在使用动态查询来减少 sql 行代码,因为稍后我正在做一个 if 条件,我将 @InvoiceTrue 变量的结果添加到另一个 sql 字符串
  • 要改掉的坏习惯 - 声明没有长度的字符串(例如,“cast (... as varchar)”。
  • 要改掉的坏习惯 - 将日期(和相关数据类型)转换为没有样式的 varchar 会产生不一致的输出,因为它取决于运行时设置。因此,请始终指定一种可以根据您的目标正确解释的样式。在此处阅读 Tibor 对 datetime datatype 的详尽讨论 - 是的,请阅读 - 没有 tl/dr.

标签: sql sql-server


【解决方案1】:

您可以使用以下内容:

DECLARE @date DATETIME = '2019-04-01'
select convert(varchar, @date, 13);  

Output is: 01 Apr 2019 00:00:00:000

如果你想在操作中看到不同的转换格式,那么你可以使用下面的sn-p:

DECLARE @counter INT = 0
DECLARE @date DATETIME = '2019-04-01'

CREATE TABLE #dateFormats (dateFormatOption int, dateOutput varchar(40))

WHILE (@counter <= 150 )
BEGIN
   BEGIN TRY
      INSERT INTO #dateFormats
      SELECT CONVERT(varchar, @counter), CONVERT(varchar,@date, @counter) 
      SET @counter = @counter + 1
   END TRY
   BEGIN CATCH;
      SET @counter = @counter + 1
      IF @counter >= 150
      BEGIN
         BREAK
      END
   END CATCH
END

SELECT * FROM #dateFormats;

参考:https://www.mssqltips.com/sqlservertip/1145/date-and-time-conversions-using-sql-server/

【讨论】:

  • 非常感谢,我已经用转换加计数器替换了演员表,并返回了我需要的数据。我只是收到一个错误:字符串 '' 后的未闭合引号。
猜你喜欢
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
相关资源
最近更新 更多